Full Code of IUrreta/DatabaseEditor for AI

release 1dc9d243130d cached
104 files
4.0 MB
1.1M tokens
1194 symbols
1 requests
Download .txt
Showing preview only (4,226K chars total). Download the full file or copy to clipboard to get everything.
Repository: IUrreta/DatabaseEditor
Branch: release
Commit: 1dc9d243130d
Files: 104
Total size: 4.0 MB

Directory structure:
gitextract_craxx02i/

├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   └── feature_request.md
│   └── workflows/
│       └── nightly.yml
├── .gitignore
├── LICENSE
├── README.md
├── api/
│   ├── ask-openai.js
│   ├── auth/
│   │   └── patreon/
│   │       ├── login.js
│   │       ├── logout.js
│   │       └── verify.js
│   ├── check-cookie.js
│   ├── me.js
│   └── usage-today.js
├── assets/
│   ├── custom/
│   │   └── .gitkeep
│   └── fonts/
│       ├── NewNumbers.otf
│       ├── NumbersBold.otf
│       └── NumbersRegular.otf
├── lib/
│   ├── accessControl.js
│   ├── getUserTierServer.js
│   ├── rateLimits.js
│   └── redis.js
├── package.json
├── src/
│   ├── data/
│   │   ├── 2025_changes.json
│   │   ├── 2026_changes.json
│   │   ├── contracts_2025.json
│   │   ├── members.json
│   │   ├── news/
│   │   │   ├── news_prompts_templates.json
│   │   │   ├── news_titles_templates.json
│   │   │   ├── turning_points_prompts_templates.json
│   │   │   └── turning_points_titles_templates.json
│   │   ├── nightly_patch_notes.md
│   │   ├── records.json
│   │   └── tables_2026.json
│   ├── index.html
│   ├── index.js
│   ├── js/
│   │   ├── backend/
│   │   │   ├── UESaveHandler.js
│   │   │   ├── UESaveTool/
│   │   │   │   ├── Gvas.js
│   │   │   │   ├── GvasHeader.js
│   │   │   │   ├── LICENSE
│   │   │   │   ├── PropertyErrors.js
│   │   │   │   ├── Serializer.js
│   │   │   │   ├── arrays/
│   │   │   │   │   ├── IntArray.js
│   │   │   │   │   ├── SoftObjectArray.js
│   │   │   │   │   ├── StructArray.js
│   │   │   │   │   └── index.js
│   │   │   │   ├── factories.js
│   │   │   │   ├── index.js
│   │   │   │   └── properties/
│   │   │   │       ├── ArrayProperty.js
│   │   │   │       ├── BoolProperty.js
│   │   │   │       ├── EnumProperty.js
│   │   │   │       ├── FloatProperty.js
│   │   │   │       ├── Guid.js
│   │   │   │       ├── Int16Property.js
│   │   │   │       ├── Int64Property.js
│   │   │   │       ├── Int8Property.js
│   │   │   │       ├── IntProperty.js
│   │   │   │       ├── ObjectProperty.js
│   │   │   │       ├── Property.js
│   │   │   │       ├── SoftObjectProperty.js
│   │   │   │       ├── StrProperty.js
│   │   │   │       ├── StrProperty_.js
│   │   │   │       ├── StructProperty.js
│   │   │   │       ├── Tuple.js
│   │   │   │       └── index.js
│   │   │   ├── command.js
│   │   │   ├── commandGlobals.js
│   │   │   ├── dbManager.js
│   │   │   ├── scriptUtils/
│   │   │   │   ├── calendarUtils.js
│   │   │   │   ├── carAnalysisUtils.js
│   │   │   │   ├── carConstants.js
│   │   │   │   ├── countries.js
│   │   │   │   ├── createStaffUtils.js
│   │   │   │   ├── dbUtils.js
│   │   │   │   ├── editTeamUtils.js
│   │   │   │   ├── eidtStatsUtils.js
│   │   │   │   ├── head2head.js
│   │   │   │   ├── modUtils.js
│   │   │   │   ├── newsUtils.js
│   │   │   │   ├── recordUtils.js
│   │   │   │   ├── regulationsUtils.js
│   │   │   │   ├── transferUtils.js
│   │   │   │   └── triggerUtils.js
│   │   │   └── worker.js
│   │   └── frontend/
│   │       ├── calendar.js
│   │       ├── config.js
│   │       ├── devTools.js
│   │       ├── dragFile.js
│   │       ├── head2head.js
│   │       ├── news.js
│   │       ├── performance.js
│   │       ├── recentsManager.js
│   │       ├── regulations.js
│   │       ├── renderer.js
│   │       ├── seasonMods.js
│   │       ├── seasonViewer.js
│   │       ├── stats.js
│   │       ├── teamReplacements.js
│   │       ├── teams.js
│   │       └── transfers.js
│   ├── styles.css
│   └── themes.css
├── vercel.json
└── webpack.config.js

================================================
FILE CONTENTS
================================================

================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms

github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: f1dbeditor
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry


================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Create a report to help us improve
title: "[BUG]"
labels: bug
assignees: ''

---

**Describe the bug**
A clear and concise description of what the bug is.

**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error

**Expected behavior**
A clear and concise description of what you expected to happen.

**Save file and log.txt**
Attach a link to any file transfer web where you sharen your save and log.txt (located in the same folder as your save in the DBEditor) so I can try to reproduce the bug

**Additional context**
Add any other context about the problem here.


================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Suggest an idea for this project
title: "[FEATURE]"
labels: enhancement
assignees: ''

---

**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]

**Describe the solution you'd like**
A clear and concise description of what you want to happen.

**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.

**Additional context**
Add any other context or screenshots about the feature request here.


================================================
FILE: .github/workflows/nightly.yml
================================================
name: Nightly Vercel Deploy
on:
  schedule:
    - cron: '0 2 * * *'   # 02:00 UTC → 03:00/04:00 en Madrid según DST
  workflow_dispatch:        # para probarlo a mano

jobs:
  trigger:
    runs-on: ubuntu-latest
    steps:
      - name: Trigger Vercel Deploy Hook
        run: curl -sSf -X POST "$VERCEL_DEPLOY_HOOK_URL"
        env:
          VERCEL_DEPLOY_HOOK_URL: ${{ secrets.VERCEL_DEPLOY_HOOK_URL }}


================================================
FILE: .gitignore
================================================
node_modules
result
licenses
backup
log.txt
**/build/back
**/__pycache__
*.sav
configs/*.json
DBEditor
assets/custom/*.png
assets/custom/*.jpg
assets/custom/*.jpeg
!base24_config.json
dist/
/patreon/
*.txt
resize_images.js
.vscode/
test/
.env
.vercel/
.env*.local
AGENTS.md
*.tsx
.vercel
scripts/

================================================
FILE: LICENSE
================================================
                    GNU GENERAL PUBLIC LICENSE
                       Version 3, 29 June 2007

 Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

                            Preamble

  The GNU General Public License is a free, copyleft license for
software and other kinds of works.

  The licenses for most software and other practical works are designed
to take away your freedom to share and change the works.  By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users.  We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors.  You can apply it to
your programs, too.

  When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.

  To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights.  Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.

  For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received.  You must make sure that they, too, receive
or can get the source code.  And you must show them these terms so they
know their rights.

  Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.

  For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software.  For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.

  Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so.  This is fundamentally incompatible with the aim of
protecting users' freedom to change the software.  The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable.  Therefore, we
have designed this version of the GPL to prohibit the practice for those
products.  If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.

  Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary.  To prevent this, the GPL assures that
patents cannot be used to render the program non-free.

  The precise terms and conditions for copying, distribution and
modification follow.

                       TERMS AND CONDITIONS

  0. Definitions.

  "This License" refers to version 3 of the GNU General Public License.

  "Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.

  "The Program" refers to any copyrightable work licensed under this
License.  Each licensee is addressed as "you".  "Licensees" and
"recipients" may be individuals or organizations.

  To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy.  The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.

  A "covered work" means either the unmodified Program or a work based
on the Program.

  To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy.  Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.

  To "convey" a work means any kind of propagation that enables other
parties to make or receive copies.  Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.

  An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License.  If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.

  1. Source Code.

  The "source code" for a work means the preferred form of the work
for making modifications to it.  "Object code" means any non-source
form of a work.

  A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.

  The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form.  A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.

  The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities.  However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work.  For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.

  The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.

  The Corresponding Source for a work in source code form is that
same work.

  2. Basic Permissions.

  All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met.  This License explicitly affirms your unlimited
permission to run the unmodified Program.  The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work.  This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.

  You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force.  You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright.  Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.

  Conveying under any other circumstances is permitted solely under
the conditions stated below.  Sublicensing is not allowed; section 10
makes it unnecessary.

  3. Protecting Users' Legal Rights From Anti-Circumvention Law.

  No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.

  When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.

  4. Conveying Verbatim Copies.

  You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.

  You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.

  5. Conveying Modified Source Versions.

  You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:

    a) The work must carry prominent notices stating that you modified
    it, and giving a relevant date.

    b) The work must carry prominent notices stating that it is
    released under this License and any conditions added under section
    7.  This requirement modifies the requirement in section 4 to
    "keep intact all notices".

    c) You must license the entire work, as a whole, under this
    License to anyone who comes into possession of a copy.  This
    License will therefore apply, along with any applicable section 7
    additional terms, to the whole of the work, and all its parts,
    regardless of how they are packaged.  This License gives no
    permission to license the work in any other way, but it does not
    invalidate such permission if you have separately received it.

    d) If the work has interactive user interfaces, each must display
    Appropriate Legal Notices; however, if the Program has interactive
    interfaces that do not display Appropriate Legal Notices, your
    work need not make them do so.

  A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit.  Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.

  6. Conveying Non-Source Forms.

  You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:

    a) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by the
    Corresponding Source fixed on a durable physical medium
    customarily used for software interchange.

    b) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by a
    written offer, valid for at least three years and valid for as
    long as you offer spare parts or customer support for that product
    model, to give anyone who possesses the object code either (1) a
    copy of the Corresponding Source for all the software in the
    product that is covered by this License, on a durable physical
    medium customarily used for software interchange, for a price no
    more than your reasonable cost of physically performing this
    conveying of source, or (2) access to copy the
    Corresponding Source from a network server at no charge.

    c) Convey individual copies of the object code with a copy of the
    written offer to provide the Corresponding Source.  This
    alternative is allowed only occasionally and noncommercially, and
    only if you received the object code with such an offer, in accord
    with subsection 6b.

    d) Convey the object code by offering access from a designated
    place (gratis or for a charge), and offer equivalent access to the
    Corresponding Source in the same way through the same place at no
    further charge.  You need not require recipients to copy the
    Corresponding Source along with the object code.  If the place to
    copy the object code is a network server, the Corresponding Source
    may be on a different server (operated by you or a third party)
    that supports equivalent copying facilities, provided you maintain
    clear directions next to the object code saying where to find the
    Corresponding Source.  Regardless of what server hosts the
    Corresponding Source, you remain obligated to ensure that it is
    available for as long as needed to satisfy these requirements.

    e) Convey the object code using peer-to-peer transmission, provided
    you inform other peers where the object code and Corresponding
    Source of the work are being offered to the general public at no
    charge under subsection 6d.

  A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.

  A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling.  In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage.  For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product.  A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.

  "Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source.  The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.

  If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information.  But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).

  The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed.  Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.

  Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.

  7. Additional Terms.

  "Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law.  If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.

  When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it.  (Additional permissions may be written to require their own
removal in certain cases when you modify the work.)  You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.

  Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:

    a) Disclaiming warranty or limiting liability differently from the
    terms of sections 15 and 16 of this License; or

    b) Requiring preservation of specified reasonable legal notices or
    author attributions in that material or in the Appropriate Legal
    Notices displayed by works containing it; or

    c) Prohibiting misrepresentation of the origin of that material, or
    requiring that modified versions of such material be marked in
    reasonable ways as different from the original version; or

    d) Limiting the use for publicity purposes of names of licensors or
    authors of the material; or

    e) Declining to grant rights under trademark law for use of some
    trade names, trademarks, or service marks; or

    f) Requiring indemnification of licensors and authors of that
    material by anyone who conveys the material (or modified versions of
    it) with contractual assumptions of liability to the recipient, for
    any liability that these contractual assumptions directly impose on
    those licensors and authors.

  All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10.  If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term.  If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.

  If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.

  Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.

  8. Termination.

  You may not propagate or modify a covered work except as expressly
provided under this License.  Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).

  However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.

  Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.

  Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License.  If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.

  9. Acceptance Not Required for Having Copies.

  You are not required to accept this License in order to receive or
run a copy of the Program.  Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance.  However,
nothing other than this License grants you permission to propagate or
modify any covered work.  These actions infringe copyright if you do
not accept this License.  Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.

  10. Automatic Licensing of Downstream Recipients.

  Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License.  You are not responsible
for enforcing compliance by third parties with this License.

  An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations.  If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.

  You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License.  For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.

  11. Patents.

  A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based.  The
work thus licensed is called the contributor's "contributor version".

  A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version.  For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.

  Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.

  In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement).  To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.

  If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients.  "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.

  If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.

  A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License.  You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.

  Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.

  12. No Surrender of Others' Freedom.

  If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all.  For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.

  13. Use with the GNU Affero General Public License.

  Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work.  The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.

  14. Revised Versions of this License.

  The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time.  Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.

  Each version is given a distinguishing version number.  If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation.  If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.

  If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.

  Later license versions may give you additional or different
permissions.  However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.

  15. Disclaimer of Warranty.

  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

  16. Limitation of Liability.

  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.

  17. Interpretation of Sections 15 and 16.

  If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.

                     END OF TERMS AND CONDITIONS

            How to Apply These Terms to Your New Programs

  If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.

  To do so, attach the following notices to the program.  It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.

    <one line to give the program's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.

Also add information on how to contact you by electronic and paper mail.

  If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:

    <program>  Copyright (C) <year>  <name of author>
    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
    This is free software, and you are welcome to redistribute it
    under certain conditions; type `show c' for details.

The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License.  Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".

  You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.

  The GNU General Public License does not permit incorporating your program
into proprietary programs.  If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library.  If this is what you want to do, use the GNU Lesser General
Public License instead of this License.  But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.


================================================
FILE: README.md
================================================
<img width="1875" height="625" alt="Copia de DATABASE EDITOR F1 MANAGER 23" src="https://github.com/user-attachments/assets/7cb4d0ae-f6a5-4d79-9ab5-139e5f5513e2" />

<h3>OPEN SOURCE TOOL TO EDIT YOUR SAVE FILES FROM F1 MANAGER 23 & 24</h3>
<h4>Supports every bit of cuistomization you can imagine, and even more</h4>

[![Discord](https://img.shields.io/badge/Discord-Community-5865F2?style=flat-square&logo=discord&logoColor=white)](https://discord.gg/3QXg3hsD8B)
[![Patreon](https://img.shields.io/badge/Patreon-Support%20the%20project-F96854?style=flat-square&logo=patreon&logoColor=white)](https://www.patreon.com/f1dbeditor)
[![GitHub Release](https://img.shields.io/github/v/release/IUrreta/DatabaseEditor?style=flat-square&logo=github&logoColor=white)](https://github.com/IUrreta/DatabaseEditor/releases/latest)
[![GitHub Stars](https://img.shields.io/github/stars/IUrreta/DatabaseEditor?style=flat-square&logo=github&logoColor=white)](https://github.com/IUrreta/DatabaseEditor/stargazers)

## Features Overview

### Driver & Staff Management

- **Transfers** between teams for both drivers and staff  
- **Edit contracts**, including future deals and salaries  
- **View pre-contracts** at a glance with icons  
- **Edit stats**, mentality, and marketability  
- **Rename** any driver or staff member (even abbreviations)  
- **Compare** two drivers or staff members side-by-side
- **Visualize** next year's grid

<p align="center">
  <img width="45%" src="https://github.com/user-attachments/assets/a20915e9-c7ce-48b5-8e51-d4a6c72e01f3" />
  <img width="45%" src="https://github.com/user-attachments/assets/5b73f044-feb7-4f43-9841-fa21a7eeea07" /><br/>
  <img width="45%" src="https://github.com/user-attachments/assets/ac01d8ac-e03d-45ce-94e6-f4bd4ef425e7" />
  <img width="45%" src="https://github.com/user-attachments/assets/c69be6f8-9056-4e69-8632-952a190d2283" />
</p>

---

### Season & Calendar Customization

- **Edit race calendar**, including race order and weather  
- **Difficulty presets** — make your save harder with adjustable challenges  
- **Freeze mentality system** if you don’t want it affecting your gameplay  
- **Fix AI not refurbishing facilities**  
- **Change team** at any moment  

<p align="center">
  <img width="90%" src="https://github.com/user-attachments/assets/0dfaa612-3ae6-405d-8b06-217d018507af" />
  <img width="90%" src="https://github.com/user-attachments/assets/447c9aab-87ce-4693-8166-a36cd543e837" />
</p>

> [!CAUTION]
> For editing the **order or number of races**, it’s still recommended to do it before the first race of the season.  
> You can safely edit race weather anytime.

---

### Car & Engine Management

- **Edit every car stat** from all teams, including **espertise**
- **View performance evolution** across the season and details in all areas  
- **Compare performance** attributes with graphs  
- **Edit or add new engine suppliers**  

<p align="center">
  <img width="45%" src="https://github.com/user-attachments/assets/aac7145b-624e-4de0-b3dc-d41027dc8290" />
  <img width="45%" src="https://github.com/user-attachments/assets/5ca943d5-43f9-4872-8710-c23bbe95c39e" /><br/>
  <img width="45%" src="https://github.com/user-attachments/assets/7e61cdbb-c2a8-4874-9144-2d967c4a86bc" />
  <img width="45%" src="https://github.com/user-attachments/assets/a488a752-b45e-4313-bd87-28f62261c1ad" />
</p>

---

### Team Management

- Edit **facilities**, **budget cap**, **objectives**, **pit crew**, and more  
- Change **engine supplier** instantly  

<p align="center">
  <img width="90%" src="https://github.com/user-attachments/assets/aa316454-6437-45e1-aa03-7e0a0be4af96" />
</p>

---

### Career History & Stats
- View past seasons in a **Wikipedia-style table**   (including F2/F3)
- Check **career records** (wins, poles, podiums, WDCs, points...)
- See **all details at once** with Season Review
- See **every session result** and **edit race results**
- Compare **drivers and teams** through detailed **Head-to-Head** charts  

<p align="center">
  <img width="45%" src="https://github.com/user-attachments/assets/6318515c-abaf-45c0-b1be-199c1e64397b" />
  <img width="45%" src="https://github.com/user-attachments/assets/771ffc67-07e1-49b7-a4ef-01b9b0e0a713" />
  <img width="45%"  src="https://github.com/user-attachments/assets/ed5b3f84-ef60-4062-b558-21730841a062" />
  <img width="45%" src="https://github.com/user-attachments/assets/a1b33991-0d53-4a26-83be-e203c3a02b5c" />
  <img width="90%" src="https://github.com/user-attachments/assets/601100a0-ffa0-4eef-9aba-ed45ec7111b6" />

</p>

---

### News System & Turning Points

- Follow your career’s storylines through the **News Tab**  
- **Decide outcomes** of major events with the new **Turning Points** system  
- All news and outcomes are stored directly in your save file  

<p align="center">
  <img width="90%" src="https://github.com/user-attachments/assets/4673f79d-acaa-464b-8631-fea0315e64d7" /><br/>
  <img width="90%" src="https://github.com/user-attachments/assets/9e550082-4922-40db-9be1-3b892f405484" />
</p>

---

### Seasonal Mods

Update your freshly created save to the 2025 or 2026 seasons with a complete database overhaul with **driver transfers**, **car and engine performance**, **driver ratings**, **calendars**, **regulations** and even **FREE TURNING POINTS** for engine development in the 2026 Season Update! (also available in Settings -> Editor)

<p align="center">
  <img width="45%" src="https://github.com/user-attachments/assets/288239ee-0cee-4ffe-8c8e-34462eadf38f" />
  <img width="45%" src="https://github.com/user-attachments/assets/9011a678-9aee-462d-b9ce-3fe4d81abc81" />
</p>

---

### Credits

- [xAranaktu for the Save Repacker](https://github.com/xAranaktu/F1-Manager-2022-SaveFile-Repacker)
- F1 Dark font: Font used under CC BY 4.0  Source: https://www.onlinewebfonts.com


================================================
FILE: api/ask-openai.js
================================================
import OpenAI from "openai";
import { getUserTierServer } from "../lib/getUserTierServer.js";
import { getDailyLimitForTier } from "../lib/rateLimits.js";
import { redis } from "../lib/redis.js";

const client = new OpenAI({
  apiKey: process.env.OPENAI_API_KEY,
});

export default async function handler(req, res) {
  try {
    const body =
      typeof req.body === "string" ? JSON.parse(req.body) : req.body;

    const { messages, max_tokens } = body;

    // 1️⃣ Auth
    const user = getUserTierServer(req);
    if (!user.isLoggedIn) {
      return res.status(401).json({ error: "Not logged in" });
    }

    const tier = user.tier;
    const userId = user.id;

    // 2️⃣ Limit desde ENV
    const limit = getDailyLimitForTier(tier);

    // 3️⃣ Redis key
    const today = new Date().toISOString().slice(0, 10);
    const redisKey = `ratelimit:${userId}:${today}`;

    let used = Number(await redis.get(redisKey)) || 0;

    // 4️⃣ Rate limit
    if (used >= limit) {
      return res.status(429).json({
        error: "Daily limit reached",
      });
    }

    // 5️⃣ Incremento
    await redis.incr(redisKey);
    await redis.expire(redisKey, 60 * 60 * 24);

    // 6️⃣ OpenAI
    let aiModel = "gpt-5-mini";
    if (tier === "Backer") {
      aiModel = "gpt-5-nano";
    }
    else if (tier === "Insider") {
      const firstHalfLimit = Math.ceil(limit / 2);
      aiModel = used < firstHalfLimit ? "gpt-5-mini" : "gpt-5-nano";
    }
    const safeMaxTokens = Math.min(max_tokens || 1500, 4000);

    const input = messages.map(m => ({
      role: m.role,
      content: m.content
    }));

    const response = await client.responses.create({
      model: aiModel,
      input,
      max_output_tokens: safeMaxTokens,
      reasoning: {"effort": "low"}
    });

    const text = response.output_text || "";

    return res.status(200).json({
      text,
      used: used + 1,
      limit
    });

  } catch (err) {
    console.error("OpenAI API error:", err);
    return res.status(500).json({ error: err.message });
  }
}


================================================
FILE: api/auth/patreon/login.js
================================================
export default function handler(req, res) {
    const { PATREON_CLIENT_ID, PATREON_REDIRECT_URI } = process.env;

    if (!PATREON_CLIENT_ID || !PATREON_REDIRECT_URI) {
        return res.status(500).json({ error: 'Missing Patreon environment variables' });
    }

    // Scopes: identity (profile), identity.memberships (campaign info)
    const scopes = 'identity identity.memberships';
    const redirectUrl = `https://www.patreon.com/oauth2/authorize?response_type=code&client_id=${PATREON_CLIENT_ID}&redirect_uri=${encodeURIComponent(PATREON_REDIRECT_URI)}&scope=${encodeURIComponent(scopes)}`;

    res.redirect(redirectUrl);
}


================================================
FILE: api/auth/patreon/logout.js
================================================
import { serialize } from 'cookie';

export default function handler(req, res) {
    const cookie = serialize('auth_token', '', {
        httpOnly: true,
        secure: process.env.NODE_ENV === 'production',
        sameSite: 'strict',
        path: '/',
        maxAge: -1,
    });

    res.setHeader('Set-Cookie', cookie);

    res.status(200).json({ success: true, message: 'Logged out successfully' });
}

================================================
FILE: api/auth/patreon/verify.js
================================================
import jwt from 'jsonwebtoken';
import { serialize } from 'cookie';
import { getEffectiveTier } from '../../../lib/accessControl.js';

export default async function handler(req, res) {
    const { code } = req.query;
    const { PATREON_CLIENT_ID, PATREON_CLIENT_SECRET, PATREON_REDIRECT_URI } = process.env;

    if (!code) {
        return res.status(400).json({ error: 'Missing code parameter' });
    }

    if (!PATREON_CLIENT_ID || !PATREON_CLIENT_SECRET || !PATREON_REDIRECT_URI) {
        return res.status(500).json({ error: 'Missing Patreon environment variables' });
    }

    try {
        // 1. Exchange code for access token
        const tokenResponse = await fetch('https://www.patreon.com/api/oauth2/token', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded',
            },
            body: new URLSearchParams({
                code,
                grant_type: 'authorization_code',
                client_id: PATREON_CLIENT_ID,
                client_secret: PATREON_CLIENT_SECRET,
                redirect_uri: PATREON_REDIRECT_URI,
            }),
        });

        const tokenData = await tokenResponse.json();

        if (!tokenResponse.ok) {
            console.error('Token exchange failed:', tokenData);
            return res.status(tokenResponse.status).json({ error: 'Failed to exchange token', details: tokenData });
        }

        const accessToken = tokenData.access_token;

        // 2. Fetch user identity and memberships
        // Using API v2
        const identityResponse = await fetch('https://www.patreon.com/api/oauth2/v2/identity?include=memberships.currently_entitled_tiers&fields%5Buser%5D=full_name,thumb_url&fields%5Bmember%5D=patron_status,currently_entitled_amount_cents&fields%5Btier%5D=title', {
            headers: {
                Authorization: `Bearer ${accessToken}`,
            },
        });

        const identityData = await identityResponse.json();

        if (!identityResponse.ok) {
            console.error('Identity fetch failed:', identityData);
            return res.status(identityResponse.status).json({ error: 'Failed to fetch identity', details: identityData });
        }

        // 3. Parse membership data to find tier
        const memberships = identityData.included || [];
        let isMember = false;
        let tier = 'Free';
        let amountCents = 0;
        let tierName = 'None';

        const tierIDs = ["25157070", "25124139", "25132338"];
        const paidTiers = ["Backer", "Insider", "Founder"];
        const patronStatusOrder = {
            "None": 0,
            "Free": 0,
            "Backer": 1,
            "Insider": 2,
            "Founder": 3
        };

        // Logic to determine tier based on memberships
        for (const item of memberships) {
            if (item.type === 'member' && item.attributes.patron_status === 'active_patron') {
                isMember = true;
                amountCents = item.attributes.currently_entitled_amount_cents;
            }
            if (item.type === 'tier' && tierIDs.includes(item.id)) {
                //get the highest, order is backer -> insider -> founder
                if (patronStatusOrder[item.attributes.title] > patronStatusOrder[tierName]) {
                    tierName = item.attributes.title;
                }
            }
        }

        if (isMember) {
            tier = tierName;
        }

        const fullName = identityData?.data?.attributes?.full_name || "";
        const baseTier = tier;
        const { tier: effectiveTier, whitelisted } = getEffectiveTier({ name: fullName, baseTier });
        const isPaid = paidTiers.includes(effectiveTier);
        const tierNumbers = {
            "Free": 0,
            "Backer": 1,
            "Insider": 2,
            "Founder": 3
        };

        const patreonUser = {
            name: fullName,
            thumbUrl: identityData.data.attributes.thumb_url,
            isMember,
            amountCents,
            tier: effectiveTier,
        };

        const token = jwt.sign(
            {
                name: patreonUser.name,
                tier: baseTier,
                patreonId: identityData.data.id
            },
            process.env.JWT_SECRET,
            { expiresIn: '30d' }
        );

        const serializedCookie = serialize('auth_token', token, {
            httpOnly: true,  // VITAL: Browser JS cannot read this
            secure: process.env.NODE_ENV === 'production', // HTTPS only
            sameSite: 'strict',
            maxAge: 60 * 60 * 24 * 30, // 30 days
            path: '/'
        });

        res.setHeader('Set-Cookie', serializedCookie);

        return res.status(200).json({
            success: true,
            user: { fullName: patreonUser.name },
            tier: patreonUser.tier,
            tierNumber: tierNumbers[patreonUser.tier] ?? 0,
            whitelisted,
            isLoggedIn: true,
            paidMember: isPaid
        });

    } catch (error) {
        console.error('Server error:', error);
        return res.status(500).json({ error: 'Internal server error', message: error.message });
    }
}


================================================
FILE: api/check-cookie.js
================================================
import jwt from "jsonwebtoken";
import { serialize } from "cookie";

export default function handler(req, res) {
  const { auth_token } = req.cookies || {};

  if (!auth_token) {
    // No cookie present: user is simply not logged in; no redirect needed.
    return res.status(200).json({ ok: true, hasCookie: false, valid: true });
  }

  try {
    const decoded = jwt.verify(auth_token, process.env.JWT_SECRET);

    if (!decoded.patreonId) {
      // Delete cookie
      const del = serialize("auth_token", "", {
        httpOnly: true,
        secure: process.env.NODE_ENV === "production",
        sameSite: "strict",
        expires: new Date(0),
        path: "/",
      });

      res.setHeader("Set-Cookie", del);
      return res.status(200).json({ ok: true, hasCookie: true, valid: false });
    }

    return res.status(200).json({ ok: true, hasCookie: true, valid: true });
  } catch (err) {
    // Bad cookie → borrar también
    const del = serialize("auth_token", "", {
      httpOnly: true,
      secure: process.env.NODE_ENV === "production",
      sameSite: "strict",
      expires: new Date(0),
      path: "/",
    });

    res.setHeader("Set-Cookie", del);
    return res.status(200).json({ ok: true, hasCookie: true, valid: false });
  }
}


================================================
FILE: api/me.js
================================================
import jwt from 'jsonwebtoken';
import { getEffectiveTier } from '../lib/accessControl.js';

export default function handler(req, res) {
    // Vercel parses the cookie string automatically into req.cookies
    const { auth_token } = req.cookies;

    if (!auth_token) {
        return res.json({
            isLoggedIn: false,
            paidMember: false,
            tier: 'Free',
            whitelisted: false
        });
    }

    try {
        // Verify the token signature
        const decoded = jwt.verify(auth_token, process.env.JWT_SECRET);

        const paidTiers = ["Backer", "Insider", "Founder"];
        const { tier, whitelisted } = getEffectiveTier({ name: decoded.name, baseTier: decoded.tier });
        const isPaid = paidTiers.includes(tier);
        const tierNumbers = {
            "Free": 0,
            "Backer": 1,
            "Insider": 2,
            "Founder": 3
        }

        return res.json({
            isLoggedIn: true,
            paidMember: isPaid,
            tier: tier,
            tierNumber: tierNumbers[tier] ?? 0,
            whitelisted,
            user: { fullName: decoded.name },
        });

    } catch (err) {
        // Token is invalid or expired
        return res.json({
            isLoggedIn: false,
            paidMember: false,
            tier: 'Free',
            whitelisted: false
        });
    }
}


================================================
FILE: api/usage-today.js
================================================
import { getUserTierServer } from "../lib/getUserTierServer.js";
import { getDailyLimitForTier } from "../lib/rateLimits.js";
import { redis } from "../lib/redis.js";

export default async function handler(req, res) {
  try {
    const user = getUserTierServer(req);

    if (!user.isLoggedIn) {
      return res.status(401).json({ error: "Not logged in" });
    }

    const userId = user.id;
    const tier = user.tier;
    const limit = getDailyLimitForTier(tier);

    const today = new Date().toISOString().slice(0, 10);
    const redisKey = `ratelimit:${userId}:${today}`;

    let used = await redis.get(redisKey);
    if (!used) used = 0;
    used = Number(used);

    const percentage = limit > 0
      ? Math.min(100, Math.round((used / limit) * 100))
      : 0;

    return res.status(200).json({
      used,
      limit,
      percentage
    });

  } catch (err) {
    console.error("Usage endpoint error:", err);
    return res.status(500).json({ error: err.message });
  }
}


================================================
FILE: assets/custom/.gitkeep
================================================


================================================
FILE: lib/accessControl.js
================================================
const TIER_ORDER = {
  Free: 0,
  Backer: 1,
  Insider: 2,
  Founder: 3,
};

function normalizeName(name) {
  return String(name || "").trim().toLowerCase();
}

function parseEnvList(value) {
  if (!value) return new Set();
  return new Set(
    String(value)
      .split(/[,\n]/g)
      .map((item) => normalizeName(item))
      .filter(Boolean)
  );
}

function maxTier(a, b) {
  const aOrder = TIER_ORDER[a] ?? -1;
  const bOrder = TIER_ORDER[b] ?? -1;
  return aOrder >= bOrder ? a : b;
}

/**
 * Applies server-side access overrides controlled by env vars.
 *
 * Env vars:
 * - DEVELOPER_NAME: exact Patreon `full_name` to force "Founder"
 * - INSIDER_WHITELIST: comma/newline-separated names to grant at least "Founder"
 */
export function getEffectiveTier({ name, baseTier }) {
  const normalizedUserName = normalizeName(name);
  let tier = baseTier || "Free";
  let whitelisted = false;

  const developerName = normalizeName(process.env.DEVELOPER_NAME);
  if (developerName && normalizedUserName === developerName) {
    return { tier: "Founder", whitelisted: false };
  }

  const insiderWhitelist = parseEnvList(process.env.INSIDER_WHITELIST);
  if (insiderWhitelist.has(normalizedUserName)) {
    tier = maxTier(tier, "Founder");
    whitelisted = true;
  }

  return { tier, whitelisted };
}



================================================
FILE: lib/getUserTierServer.js
================================================
import jwt from "jsonwebtoken";
import { getEffectiveTier } from "./accessControl.js";

export function getUserTierServer(req) {
  const { auth_token } = req.cookies || {};

  if (!auth_token) {
    return {
      isLoggedIn: false,
      paidMember: false,
      tier: "Free",
      whitelisted: false,
      user: null,
      id: null
    };
  }

  try {
    const decoded = jwt.verify(auth_token, process.env.JWT_SECRET);

    const paidTiers = ["Backer", "Insider", "Founder"];
    const { tier, whitelisted } = getEffectiveTier({ name: decoded.name, baseTier: decoded.tier });
    const isPaid = paidTiers.includes(tier);

    return {
      isLoggedIn: true,
      paidMember: isPaid,
      tier,
      whitelisted,
      user: { fullName: decoded.name },
      id: decoded.patreonId
    };

  } catch (err) {
    return {
      isLoggedIn: false,
      paidMember: false,
      tier: "Free",
      whitelisted: false,
      user: null,
      id: null
    };
  }
}


================================================
FILE: lib/rateLimits.js
================================================
export function getDailyLimitForTier(tier) {
  const limits = {
    Founder: Number(process.env.DAILY_LIMIT_FOUNDER),
    Insider: Number(process.env.DAILY_LIMIT_INSIDER),
    Backer: Number(process.env.DAILY_LIMIT_BACKER),
    Free: Number(process.env.DAILY_LIMIT_FREE),
  };

  return limits[tier] ?? limits.Free;
}

================================================
FILE: lib/redis.js
================================================
import { Redis } from "@upstash/redis";

export const redis = Redis.fromEnv();

================================================
FILE: package.json
================================================
{
  "name": "Database Editor F1 Manager",
  "version": "3.5.13",
  "description": "A tool that will let you edit your save file from F1 Manager games",
  "main": "main.js",
  "scripts": {
    "build": "webpack",
    "optimize:logos": "node scripts/optimize-team-logos.js"
  },
  "repository": "https://github.com/IUrreta/DatabaseEditor",
  "author": "IUrreta",
  "license": "LGPL-3.0-or-later",
  "dependencies": {
    "@upstash/redis": "^1.35.7",
    "@vercel/analytics": "^1.5.0",
    "@vercel/speed-insights": "^1.2.0",
    "autoprefixer": "^10.4.20",
    "babel-loader": "^9.2.1",
    "bootstrap": "^5.3.3",
    "bootstrap-icons": "^1.11.0",
    "buffer": "^6.0.3",
    "chart.js": "^4.4.0",
    "chartjs-plugin-annotation": "^3.0.1",
    "chartjs-plugin-datalabels": "^2.2.0",
    "cookie": "^1.0.2",
    "copy-webpack-plugin": "^12.0.2",
    "crypto-browserify": "^3.12.1",
    "css-loader": "^7.1.2",
    "csv-parser": "^3.2.0",
    "dompurify": "^3.3.0",
    "file-saver": "^2.0.5",
    "html-webpack-plugin": "^5.6.3",
    "idb-keyval": "^6.2.2",
    "image-minimizer-webpack-plugin": "^4.1.3",
    "interactjs": "^1.10.17",
    "jsonwebtoken": "^9.0.2",
    "lz-string": "^1.5.0",
    "marked": "^7.0.3",
    "mini-css-extract-plugin": "^2.9.2",
    "openai": "^6.10.0",
    "pako": "^2.1.0",
    "playwright": "^1.57.0",
    "postcss-loader": "^8.1.1",
    "sass": "^1.84.0",
    "sass-loader": "^16.0.4",
    "sharp": "^0.33.5",
    "simple-git": "^3.19.1",
    "sql.js": "^1.13.0",
    "style-loader": "^4.0.0",
    "turndown": "^7.2.2",
    "webpack": "^5.97.1",
    "webpack-cli": "^5.1.4"
  },
  "devDependencies": {
    "@playwright/test": "^1.57.0"
  }
}


================================================
FILE: src/data/2025_changes.json
================================================
{
    "Stats": [
        {
            "Max": 100,
            "StaffID": 1,
            "StatID": 2,
            "Val": 93
        },
        {
            "Max": 100,
            "StaffID": 1,
            "StatID": 3,
            "Val": 95
        },
        {
            "Max": 100,
            "StaffID": 1,
            "StatID": 4,
            "Val": 92
        },
        {
            "Max": 100,
            "StaffID": 1,
            "StatID": 5,
            "Val": 90
        },
        {
            "Max": 100,
            "StaffID": 1,
            "StatID": 6,
            "Val": 90
        },
        {
            "Max": 100,
            "StaffID": 1,
            "StatID": 7,
            "Val": 90
        },
        {
            "Max": 100,
            "StaffID": 1,
            "StatID": 8,
            "Val": 94
        },
        {
            "Max": 100,
            "StaffID": 1,
            "StatID": 9,
            "Val": 86
        },
        {
            "Max": 100,
            "StaffID": 1,
            "StatID": 10,
            "Val": 83
        },
        {
            "Max": 100,
            "StaffID": 2,
            "StatID": 2,
            "Val": 96
        },
        {
            "Max": 100,
            "StaffID": 2,
            "StatID": 3,
            "Val": 96
        },
        {
            "Max": 100,
            "StaffID": 2,
            "StatID": 4,
            "Val": 89
        },
        {
            "Max": 100,
            "StaffID": 2,
            "StatID": 5,
            "Val": 86
        },
        {
            "Max": 100,
            "StaffID": 2,
            "StatID": 6,
            "Val": 89
        },
        {
            "Max": 100,
            "StaffID": 2,
            "StatID": 7,
            "Val": 87
        },
        {
            "Max": 100,
            "StaffID": 2,
            "StatID": 8,
            "Val": 91
        },
        {
            "Max": 100,
            "StaffID": 2,
            "StatID": 9,
            "Val": 86
        },
        {
            "Max": 100,
            "StaffID": 2,
            "StatID": 10,
            "Val": 85
        },
        {
            "Max": 100,
            "StaffID": 3,
            "StatID": 2,
            "Val": 81
        },
        {
            "Max": 100,
            "StaffID": 3,
            "StatID": 3,
            "Val": 78
        },
        {
            "Max": 100,
            "StaffID": 3,
            "StatID": 4,
            "Val": 85
        },
        {
            "Max": 100,
            "StaffID": 3,
            "StatID": 5,
            "Val": 80
        },
        {
            "Max": 100,
            "StaffID": 3,
            "StatID": 6,
            "Val": 85
        },
        {
            "Max": 100,
            "StaffID": 3,
            "StatID": 7,
            "Val": 84
        },
        {
            "Max": 100,
            "StaffID": 3,
            "StatID": 8,
            "Val": 86
        },
        {
            "Max": 100,
            "StaffID": 3,
            "StatID": 9,
            "Val": 87
        },
        {
            "Max": 100,
            "StaffID": 3,
            "StatID": 10,
            "Val": 79
        },
        {
            "Max": 100,
            "StaffID": 8,
            "StatID": 2,
            "Val": 80
        },
        {
            "Max": 100,
            "StaffID": 8,
            "StatID": 3,
            "Val": 82
        },
        {
            "Max": 100,
            "StaffID": 8,
            "StatID": 4,
            "Val": 90
        },
        {
            "Max": 100,
            "StaffID": 8,
            "StatID": 5,
            "Val": 75
        },
        {
            "Max": 100,
            "StaffID": 8,
            "StatID": 6,
            "Val": 72
        },
        {
            "Max": 100,
            "StaffID": 8,
            "StatID": 7,
            "Val": 78
        },
        {
            "Max": 100,
            "StaffID": 8,
            "StatID": 8,
            "Val": 83
        },
        {
            "Max": 100,
            "StaffID": 8,
            "StatID": 9,
            "Val": 82
        },
        {
            "Max": 100,
            "StaffID": 8,
            "StatID": 10,
            "Val": 89
        },
        {
            "Max": 100,
            "StaffID": 10,
            "StatID": 2,
            "Val": 96
        },
        {
            "Max": 100,
            "StaffID": 10,
            "StatID": 3,
            "Val": 97
        },
        {
            "Max": 100,
            "StaffID": 10,
            "StatID": 4,
            "Val": 92
        },
        {
            "Max": 100,
            "StaffID": 10,
            "StatID": 5,
            "Val": 89
        },
        {
            "Max": 100,
            "StaffID": 10,
            "StatID": 6,
            "Val": 91
        },
        {
            "Max": 100,
            "StaffID": 10,
            "StatID": 7,
            "Val": 92
        },
        {
            "Max": 100,
            "StaffID": 10,
            "StatID": 8,
            "Val": 98
        },
        {
            "Max": 100,
            "StaffID": 10,
            "StatID": 9,
            "Val": 92
        },
        {
            "Max": 100,
            "StaffID": 10,
            "StatID": 10,
            "Val": 87
        },
        {
            "Max": 100,
            "StaffID": 11,
            "StatID": 2,
            "Val": 90
        },
        {
            "Max": 100,
            "StaffID": 11,
            "StatID": 3,
            "Val": 92
        },
        {
            "Max": 100,
            "StaffID": 11,
            "StatID": 4,
            "Val": 86
        },
        {
            "Max": 100,
            "StaffID": 11,
            "StatID": 5,
            "Val": 80
        },
        {
            "Max": 100,
            "StaffID": 11,
            "StatID": 6,
            "Val": 81
        },
        {
            "Max": 100,
            "StaffID": 11,
            "StatID": 7,
            "Val": 90
        },
        {
            "Max": 100,
            "StaffID": 11,
            "StatID": 8,
            "Val": 94
        },
        {
            "Max": 100,
            "StaffID": 11,
            "StatID": 9,
            "Val": 87
        },
        {
            "Max": 100,
            "StaffID": 11,
            "StatID": 10,
            "Val": 86
        },
        {
            "Max": 100,
            "StaffID": 12,
            "StatID": 2,
            "Val": 88
        },
        {
            "Max": 100,
            "StaffID": 12,
            "StatID": 3,
            "Val": 89
        },
        {
            "Max": 100,
            "StaffID": 12,
            "StatID": 4,
            "Val": 96
        },
        {
            "Max": 100,
            "StaffID": 12,
            "StatID": 5,
            "Val": 95
        },
        {
            "Max": 100,
            "StaffID": 12,
            "StatID": 6,
            "Val": 78
        },
        {
            "Max": 100,
            "StaffID": 12,
            "StatID": 7,
            "Val": 86
        },
        {
            "Max": 100,
            "StaffID": 12,
            "StatID": 8,
            "Val": 87
        },
        {
            "Max": 100,
            "StaffID": 12,
            "StatID": 9,
            "Val": 85
        },
        {
            "Max": 100,
            "StaffID": 12,
            "StatID": 10,
            "Val": 80
        },
        {
            "Max": 100,
            "StaffID": 13,
            "StatID": 2,
            "Val": 79
        },
        {
            "Max": 100,
            "StaffID": 13,
            "StatID": 3,
            "Val": 75
        },
        {
            "Max": 100,
            "StaffID": 13,
            "StatID": 4,
            "Val": 82
        },
        {
            "Max": 100,
            "StaffID": 13,
            "StatID": 5,
            "Val": 86
        },
        {
            "Max": 100,
            "StaffID": 13,
            "StatID": 6,
            "Val": 74
        },
        {
            "Max": 100,
            "StaffID": 13,
            "StatID": 7,
            "Val": 78
        },
        {
            "Max": 100,
            "StaffID": 13,
            "StatID": 8,
            "Val": 82
        },
        {
            "Max": 100,
            "StaffID": 13,
            "StatID": 9,
            "Val": 81
        },
        {
            "Max": 100,
            "StaffID": 13,
            "StatID": 10,
            "Val": 83
        },
        {
            "Max": 100,
            "StaffID": 14,
            "StatID": 2,
            "Val": 81
        },
        {
            "Max": 100,
            "StaffID": 14,
            "StatID": 3,
            "Val": 77
        },
        {
            "Max": 100,
            "StaffID": 14,
            "StatID": 4,
            "Val": 84
        },
        {
            "Max": 100,
            "StaffID": 14,
            "StatID": 5,
            "Val": 83
        },
        {
            "Max": 100,
            "StaffID": 14,
            "StatID": 6,
            "Val": 78
        },
        {
            "Max": 100,
            "StaffID": 14,
            "StatID": 7,
            "Val": 83
        },
        {
            "Max": 100,
            "StaffID": 14,
            "StatID": 8,
            "Val": 84
        },
        {
            "Max": 100,
            "StaffID": 14,
            "StatID": 9,
            "Val": 78
        },
        {
            "Max": 100,
            "StaffID": 14,
            "StatID": 10,
            "Val": 93
        },
        {
            "Max": 100,
            "StaffID": 15,
            "StatID": 2,
            "Val": 84
        },
        {
            "Max": 100,
            "StaffID": 15,
            "StatID": 3,
            "Val": 83
        },
        {
            "Max": 100,
            "StaffID": 15,
            "StatID": 4,
            "Val": 91
        },
        {
            "Max": 100,
            "StaffID": 15,
            "StatID": 5,
            "Val": 88
        },
        {
            "Max": 100,
            "StaffID": 15,
            "StatID": 6,
            "Val": 93
        },
        {
            "Max": 100,
            "StaffID": 15,
            "StatID": 7,
            "Val": 83
        },
        {
            "Max": 100,
            "StaffID": 15,
            "StatID": 8,
            "Val": 82
        },
        {
            "Max": 100,
            "StaffID": 15,
            "StatID": 9,
            "Val": 80
        },
        {
            "Max": 100,
            "StaffID": 15,
            "StatID": 10,
            "Val": 76
        },
        {
            "Max": 100,
            "StaffID": 17,
            "StatID": 2,
            "Val": 82
        },
        {
            "Max": 100,
            "StaffID": 17,
            "StatID": 3,
            "Val": 82
        },
        {
            "Max": 100,
            "StaffID": 17,
            "StatID": 4,
            "Val": 87
        },
        {
            "Max": 100,
            "StaffID": 17,
            "StatID": 5,
            "Val": 75
        },
        {
            "Max": 100,
            "StaffID": 17,
            "StatID": 6,
            "Val": 71
        },
        {
            "Max": 100,
            "StaffID": 17,
            "StatID": 7,
            "Val": 91
        },
        {
            "Max": 100,
            "StaffID": 17,
            "StatID": 8,
            "Val": 84
        },
        {
            "Max": 100,
            "StaffID": 17,
            "StatID": 9,
            "Val": 86
        },
        {
            "Max": 100,
            "StaffID": 17,
            "StatID": 10,
            "Val": 82
        },
        {
            "Max": 100,
            "StaffID": 18,
            "StatID": 2,
            "Val": 80
        },
        {
            "Max": 100,
            "StaffID": 18,
            "StatID": 3,
            "Val": 79
        },
        {
            "Max": 100,
            "StaffID": 18,
            "StatID": 4,
            "Val": 76
        },
        {
            "Max": 100,
            "StaffID": 18,
            "StatID": 5,
            "Val": 80
        },
        {
            "Max": 100,
            "StaffID": 18,
            "StatID": 6,
            "Val": 92
        },
        {
            "Max": 100,
            "StaffID": 18,
            "StatID": 7,
            "Val": 83
        },
        {
            "Max": 100,
            "StaffID": 18,
            "StatID": 8,
            "Val": 81
        },
        {
            "Max": 100,
            "StaffID": 18,
            "StatID": 9,
            "Val": 76
        },
        {
            "Max": 100,
            "StaffID": 18,
            "StatID": 10,
            "Val": 85
        },
        {
            "Max": 100,
            "StaffID": 20,
            "StatID": 2,
            "Val": 73
        },
        {
            "Max": 100,
            "StaffID": 20,
            "StatID": 3,
            "Val": 74
        },
        {
            "Max": 100,
            "StaffID": 20,
            "StatID": 4,
            "Val": 86
        },
        {
            "Max": 100,
            "StaffID": 20,
            "StatID": 5,
            "Val": 74
        },
        {
            "Max": 100,
            "StaffID": 20,
            "StatID": 6,
            "Val": 81
        },
        {
            "Max": 100,
            "StaffID": 20,
            "StatID": 7,
            "Val": 73
        },
        {
            "Max": 100,
            "StaffID": 20,
            "StatID": 8,
            "Val": 75
        },
        {
            "Max": 100,
            "StaffID": 20,
            "StatID": 9,
            "Val": 79
        },
        {
            "Max": 100,
            "StaffID": 20,
            "StatID": 10,
            "Val": 80
        },
        {
            "Max": 100,
            "StaffID": 22,
            "StatID": 2,
            "Val": 79
        },
        {
            "Max": 100,
            "StaffID": 22,
            "StatID": 3,
            "Val": 76
        },
        {
            "Max": 100,
            "StaffID": 22,
            "StatID": 4,
            "Val": 75
        },
        {
            "Max": 100,
            "StaffID": 22,
            "StatID": 5,
            "Val": 70
        },
        {
            "Max": 100,
            "StaffID": 22,
            "StatID": 6,
            "Val": 80
        },
        {
            "Max": 100,
            "StaffID": 22,
            "StatID": 7,
            "Val": 75
        },
        {
            "Max": 100,
            "StaffID": 22,
            "StatID": 8,
            "Val": 75
        },
        {
            "Max": 100,
            "StaffID": 22,
            "StatID": 9,
            "Val": 75
        },
        {
            "Max": 100,
            "StaffID": 22,
            "StatID": 10,
            "Val": 78
        },
        {
            "Max": 100,
            "StaffID": 23,
            "StatID": 2,
            "Val": 85
        },
        {
            "Max": 100,
            "StaffID": 23,
            "StatID": 3,
            "Val": 87
        },
        {
            "Max": 100,
            "StaffID": 23,
            "StatID": 4,
            "Val": 88
        },
        {
            "Max": 100,
            "StaffID": 23,
            "StatID": 5,
            "Val": 85
        },
        {
            "Max": 100,
            "StaffID": 23,
            "StatID": 6,
            "Val": 96
        },
        {
            "Max": 100,
            "StaffID": 23,
            "StatID": 7,
            "Val": 81
        },
        {
            "Max": 100,
            "StaffID": 23,
            "StatID": 8,
            "Val": 86
        },
        {
            "Max": 100,
            "StaffID": 23,
            "StatID": 9,
            "Val": 85
        },
        {
            "Max": 100,
            "StaffID": 23,
            "StatID": 10,
            "Val": 92
        },
        {
            "Max": 100,
            "StaffID": 76,
            "StatID": 2,
            "Val": 78
        },
        {
            "Max": 100,
            "StaffID": 76,
            "StatID": 3,
            "Val": 79
        },
        {
            "Max": 100,
            "StaffID": 76,
            "StatID": 4,
            "Val": 74
        },
        {
            "Max": 100,
            "StaffID": 76,
            "StatID": 5,
            "Val": 82
        },
        {
            "Max": 100,
            "StaffID": 76,
            "StatID": 6,
            "Val": 78
        },
        {
            "Max": 100,
            "StaffID": 76,
            "StatID": 7,
            "Val": 77
        },
        {
            "Max": 100,
            "StaffID": 76,
            "StatID": 8,
            "Val": 81
        },
        {
            "Max": 100,
            "StaffID": 76,
            "StatID": 9,
            "Val": 78
        },
        {
            "Max": 100,
            "StaffID": 76,
            "StatID": 10,
            "Val": 86
        },
        {
            "Max": 100,
            "StaffID": 77,
            "StatID": 2,
            "Val": 90
        },
        {
            "Max": 100,
            "StaffID": 77,
            "StatID": 3,
            "Val": 90
        },
        {
            "Max": 100,
            "StaffID": 77,
            "StatID": 4,
            "Val": 94
        },
        {
            "Max": 100,
            "StaffID": 77,
            "StatID": 5,
            "Val": 87
        },
        {
            "Max": 100,
            "StaffID": 77,
            "StatID": 6,
            "Val": 86
        },
        {
            "Max": 100,
            "StaffID": 77,
            "StatID": 7,
            "Val": 91
        },
        {
            "Max": 100,
            "StaffID": 77,
            "StatID": 8,
            "Val": 91
        },
        {
            "Max": 100,
            "StaffID": 77,
            "StatID": 9,
            "Val": 86
        },
        {
            "Max": 100,
            "StaffID": 77,
            "StatID": 10,
            "Val": 88
        },
        {
            "Max": 100,
            "StaffID": 80,
            "StatID": 2,
            "Val": 74
        },
        {
            "Max": 100,
            "StaffID": 80,
            "StatID": 3,
            "Val": 64
        },
        {
            "Max": 100,
            "StaffID": 80,
            "StatID": 4,
            "Val": 79
        },
        {
            "Max": 100,
            "StaffID": 80,
            "StatID": 5,
            "Val": 62
        },
        {
            "Max": 100,
            "StaffID": 80,
            "StatID": 6,
            "Val": 75
        },
        {
            "Max": 100,
            "StaffID": 80,
            "StatID": 7,
            "Val": 73
        },
        {
            "Max": 100,
            "StaffID": 80,
            "StatID": 8,
            "Val": 74
        },
        {
            "Max": 100,
            "StaffID": 80,
            "StatID": 9,
            "Val": 75
        },
        {
            "Max": 100,
            "StaffID": 80,
            "StatID": 10,
            "Val": 83
        },
        {
            "Max": 100,
            "StaffID": 81,
            "StatID": 2,
            "Val": 83
        },
        {
            "Max": 100,
            "StaffID": 81,
            "StatID": 3,
            "Val": 78
        },
        {
            "Max": 100,
            "StaffID": 81,
            "StatID": 4,
            "Val": 77
        },
        {
            "Max": 100,
            "StaffID": 81,
            "StatID": 5,
            "Val": 82
        },
        {
            "Max": 100,
            "StaffID": 81,
            "StatID": 6,
            "Val": 74
        },
        {
            "Max": 100,
            "StaffID": 81,
            "StatID": 7,
            "Val": 85
        },
        {
            "Max": 100,
            "StaffID": 81,
            "StatID": 8,
            "Val": 83
        },
        {
            "Max": 100,
            "StaffID": 81,
            "StatID": 9,
            "Val": 81
        },
        {
            "Max": 100,
            "StaffID": 81,
            "StatID": 10,
            "Val": 89
        },
        {
            "Max": 100,
            "StaffID": 83,
            "StatID": 2,
            "Val": 82
        },
        {
            "Max": 100,
            "StaffID": 83,
            "StatID": 3,
            "Val": 81
        },
        {
            "Max": 100,
            "StaffID": 83,
            "StatID": 4,
            "Val": 88
        },
        {
            "Max": 100,
            "StaffID": 83,
            "StatID": 5,
            "Val": 81
        },
        {
            "Max": 100,
            "StaffID": 83,
            "StatID": 6,
            "Val": 86
        },
        {
            "Max": 100,
            "StaffID": 83,
            "StatID": 7,
            "Val": 82
        },
        {
            "Max": 100,
            "StaffID": 83,
            "StatID": 8,
            "Val": 85
        },
        {
            "Max": 100,
            "StaffID": 83,
            "StatID": 9,
            "Val": 88
        },
        {
            "Max": 100,
            "StaffID": 83,
            "StatID": 10,
            "Val": 85
        },
        {
            "Max": 100,
            "StaffID": 95,
            "StatID": 2,
            "Val": 79
        },
        {
            "Max": 100,
            "StaffID": 95,
            "StatID": 3,
            "Val": 85
        },
        {
            "Max": 100,
            "StaffID": 95,
            "StatID": 4,
            "Val": 86
        },
        {
            "Max": 100,
            "StaffID": 95,
            "StatID": 5,
            "Val": 71
        },
        {
            "Max": 100,
            "StaffID": 95,
            "StatID": 6,
            "Val": 79
        },
        {
            "Max": 100,
            "StaffID": 95,
            "StatID": 7,
            "Val": 73
        },
        {
            "Max": 100,
            "StaffID": 95,
            "StatID": 8,
            "Val": 72
        },
        {
            "Max": 100,
            "StaffID": 95,
            "StatID": 9,
            "Val": 80
        },
        {
            "Max": 100,
            "StaffID": 95,
            "StatID": 10,
            "Val": 82
        },
        {
            "Max": 100,
            "StaffID": 99,
            "StatID": 2,
            "Val": 67
        },
        {
            "Max": 100,
            "StaffID": 99,
            "StatID": 3,
            "Val": 74
        },
        {
            "Max": 100,
            "StaffID": 99,
            "StatID": 4,
            "Val": 74
        },
        {
            "Max": 100,
            "StaffID": 99,
            "StatID": 5,
            "Val": 77
        },
        {
            "Max": 100,
            "StaffID": 99,
            "StatID": 6,
            "Val": 79
        },
        {
            "Max": 100,
            "StaffID": 99,
            "StatID": 7,
            "Val": 70
        },
        {
            "Max": 100,
            "StaffID": 99,
            "StatID": 8,
            "Val": 74
        },
        {
            "Max": 100,
            "StaffID": 99,
            "StatID": 9,
            "Val": 63
        },
        {
            "Max": 100,
            "StaffID": 99,
            "StatID": 10,
            "Val": 71
        },
        {
            "Max": 100,
            "StaffID": 102,
            "StatID": 2,
            "Val": 83
        },
        {
            "Max": 100,
            "StaffID": 102,
            "StatID": 3,
            "Val": 86
        },
        {
            "Max": 100,
            "StaffID": 102,
            "StatID": 4,
            "Val": 90
        },
        {
            "Max": 100,
            "StaffID": 102,
            "StatID": 5,
            "Val": 87
        },
        {
            "Max": 100,
            "StaffID": 102,
            "StatID": 6,
            "Val": 88
        },
        {
            "Max": 100,
            "StaffID": 102,
            "StatID": 7,
            "Val": 84
        },
        {
            "Max": 100,
            "StaffID": 102,
            "StatID": 8,
            "Val": 83
        },
        {
            "Max": 100,
            "StaffID": 102,
            "StatID": 9,
            "Val": 85
        },
        {
            "Max": 100,
            "StaffID": 102,
            "StatID": 10,
            "Val": 85
        },
        {
            "Max": 100,
            "StaffID": 105,
            "StatID": 2,
            "Val": 75
        },
        {
            "Max": 100,
            "StaffID": 105,
            "StatID": 3,
            "Val": 79
        },
        {
            "Max": 100,
            "StaffID": 105,
            "StatID": 4,
            "Val": 84
        },
        {
            "Max": 100,
            "StaffID": 105,
            "StatID": 5,
            "Val": 75
        },
        {
            "Max": 100,
            "StaffID": 105,
            "StatID": 6,
            "Val": 78
        },
        {
            "Max": 100,
            "StaffID": 105,
            "StatID": 7,
            "Val": 81
        },
        {
            "Max": 100,
            "StaffID": 105,
            "StatID": 8,
            "Val": 75
        },
        {
            "Max": 100,
            "StaffID": 105,
            "StatID": 9,
            "Val": 77
        },
        {
            "Max": 100,
            "StaffID": 105,
            "StatID": 10,
            "Val": 77
        },
        {
            "Max": 100,
            "StaffID": 106,
            "StatID": 2,
            "Val": 81
        },
        {
            "Max": 100,
            "StaffID": 106,
            "StatID": 3,
            "Val": 80
        },
        {
            "Max": 100,
            "StaffID": 106,
            "StatID": 4,
            "Val": 74
        },
        {
            "Max": 100,
            "StaffID": 106,
            "StatID": 5,
            "Val": 74
        },
        {
            "Max": 100,
            "StaffID": 106,
            "StatID": 6,
            "Val": 79
        },
        {
            "Max": 100,
            "StaffID": 106,
            "StatID": 7,
            "Val": 67
        },
        {
            "Max": 100,
            "StaffID": 106,
            "StatID": 8,
            "Val": 74
        },
        {
            "Max": 100,
            "StaffID": 106,
            "StatID": 9,
            "Val": 81
        },
        {
            "Max": 100,
            "StaffID": 106,
            "StatID": 10,
            "Val": 69
        },
        {
            "Max": 100,
            "StaffID": 107,
            "StatID": 2,
            "Val": 72
        },
        {
            "Max": 100,
            "StaffID": 107,
            "StatID": 3,
            "Val": 81
        },
        {
            "Max": 100,
            "StaffID": 107,
            "StatID": 4,
            "Val": 78
        },
        {
            "Max": 100,
            "StaffID": 107,
            "StatID": 5,
            "Val": 73
        },
        {
            "Max": 100,
            "StaffID": 107,
            "StatID": 6,
            "Val": 74
        },
        {
            "Max": 100,
            "StaffID": 107,
            "StatID": 7,
            "Val": 72
        },
        {
            "Max": 100,
            "StaffID": 107,
            "StatID": 8,
            "Val": 79
        },
        {
            "Max": 100,
            "StaffID": 107,
            "StatID": 9,
            "Val": 80
        },
        {
            "Max": 100,
            "StaffID": 107,
            "StatID": 10,
            "Val": 71
        },
        {
            "Max": 100,
            "StaffID": 109,
            "StatID": 2,
            "Val": 63
        },
        {
            "Max": 100,
            "StaffID": 109,
            "StatID": 3,
            "Val": 67
        },
        {
            "Max": 100,
            "StaffID": 109,
            "StatID": 4,
            "Val": 68
        },
        {
            "Max": 100,
            "StaffID": 109,
            "StatID": 5,
            "Val": 73
        },
        {
            "Max": 100,
            "StaffID": 109,
            "StatID": 6,
            "Val": 72
        },
        {
            "Max": 100,
            "StaffID": 109,
            "StatID": 7,
            "Val": 67
        },
        {
            "Max": 100,
            "StaffID": 109,
            "StatID": 8,
            "Val": 65
        },
        {
            "Max": 100,
            "StaffID": 109,
            "StatID": 9,
            "Val": 70
        },
        {
            "Max": 100,
            "StaffID": 109,
            "StatID": 10,
            "Val": 69
        },
        {
            "Max": 100,
            "StaffID": 116,
            "StatID": 2,
            "Val": 65
        },
        {
            "Max": 100,
            "StaffID": 116,
            "StatID": 3,
            "Val": 74
        },
        {
            "Max": 100,
            "StaffID": 116,
            "StatID": 4,
            "Val": 79
        },
        {
            "Max": 100,
            "StaffID": 116,
            "StatID": 5,
            "Val": 71
        },
        {
            "Max": 100,
            "StaffID": 116,
            "StatID": 6,
            "Val": 74
        },
        {
            "Max": 100,
            "StaffID": 116,
            "StatID": 7,
            "Val": 71
        },
        {
            "Max": 100,
            "StaffID": 116,
            "StatID": 8,
            "Val": 76
        },
        {
            "Max": 100,
            "StaffID": 116,
            "StatID": 9,
            "Val": 81
        },
        {
            "Max": 100,
            "StaffID": 116,
            "StatID": 10,
            "Val": 81
        },
        {
            "Max": 100,
            "StaffID": 119,
            "StatID": 2,
            "Val": 65
        },
        {
            "Max": 100,
            "StaffID": 119,
            "StatID": 3,
            "Val": 69
        },
        {
            "Max": 100,
            "StaffID": 119,
            "StatID": 4,
            "Val": 76
        },
        {
            "Max": 100,
            "StaffID": 119,
            "StatID": 5,
            "Val": 65
        },
        {
            "Max": 100,
            "StaffID": 119,
            "StatID": 6,
            "Val": 65
        },
        {
            "Max": 100,
            "StaffID": 119,
            "StatID": 7,
            "Val": 63
        },
        {
            "Max": 100,
            "StaffID": 119,
            "StatID": 8,
            "Val": 66
        },
        {
            "Max": 100,
            "StaffID": 119,
            "StatID": 9,
            "Val": 67
        },
        {
            "Max": 100,
            "StaffID": 119,
            "StatID": 10,
            "Val": 71
        },
        {
            "Max": 100,
            "StaffID": 120,
            "StatID": 2,
            "Val": 81
        },
        {
            "Max": 100,
            "StaffID": 120,
            "StatID": 3,
            "Val": 71
        },
        {
            "Max": 100,
            "StaffID": 120,
            "StatID": 4,
            "Val": 76
        },
        {
            "Max": 100,
            "StaffID": 120,
            "StatID": 5,
            "Val": 75
        },
        {
            "Max": 100,
            "StaffID": 120,
            "StatID": 6,
            "Val": 71
        },
        {
            "Max": 100,
            "StaffID": 120,
            "StatID": 7,
            "Val": 68
        },
        {
            "Max": 100,
            "StaffID": 120,
            "StatID": 8,
            "Val": 76
        },
        {
            "Max": 100,
            "StaffID": 120,
            "StatID": 9,
            "Val": 77
        },
        {
            "Max": 100,
            "StaffID": 120,
            "StatID": 10,
            "Val": 73
        },
        {
            "Max": 100,
            "StaffID": 121,
            "StatID": 2,
            "Val": 74
        },
        {
            "Max": 100,
            "StaffID": 121,
            "StatID": 3,
            "Val": 65
        },
        {
            "Max": 100,
            "StaffID": 121,
            "StatID": 4,
            "Val": 73
        },
        {
            "Max": 100,
            "StaffID": 121,
            "StatID": 5,
            "Val": 68
        },
        {
            "Max": 100,
            "StaffID": 121,
            "StatID": 6,
            "Val": 62
        },
        {
            "Max": 100,
            "StaffID": 121,
            "StatID": 7,
            "Val": 67
        },
        {
            "Max": 100,
            "StaffID": 121,
            "StatID": 8,
            "Val": 67
        },
        {
            "Max": 100,
            "StaffID": 121,
            "StatID": 9,
            "Val": 72
        },
        {
            "Max": 100,
            "StaffID": 121,
            "StatID": 10,
            "Val": 70
        },
        {
            "Max": 100,
            "StaffID": 123,
            "StatID": 2,
            "Val": 64
        },
        {
            "Max": 100,
            "StaffID": 123,
            "StatID": 3,
            "Val": 60
        },
        {
            "Max": 100,
            "StaffID": 123,
            "StatID": 4,
            "Val": 64
        },
        {
            "Max": 100,
            "StaffID": 123,
            "StatID": 5,
            "Val": 72
        },
        {
            "Max": 100,
            "StaffID": 123,
            "StatID": 6,
            "Val": 69
        },
        {
            "Max": 100,
            "StaffID": 123,
            "StatID": 7,
            "Val": 61
        },
        {
            "Max": 100,
            "StaffID": 123,
            "StatID": 8,
            "Val": 68
        },
        {
            "Max": 100,
            "StaffID": 123,
            "StatID": 9,
            "Val": 65
        },
        {
            "Max": 100,
            "StaffID": 123,
            "StatID": 10,
            "Val": 62
        },
        {
            "Max": 100,
            "StaffID": 127,
            "StatID": 2,
            "Val": 63
        },
        {
            "Max": 100,
            "StaffID": 127,
            "StatID": 3,
            "Val": 79
        },
        {
            "Max": 100,
            "StaffID": 127,
            "StatID": 4,
            "Val": 69
        },
        {
            "Max": 100,
            "StaffID": 127,
            "StatID": 5,
            "Val": 60
        },
        {
            "Max": 100,
            "StaffID": 127,
            "StatID": 6,
            "Val": 70
        },
        {
            "Max": 100,
            "StaffID": 127,
            "StatID": 7,
            "Val": 66
        },
        {
            "Max": 100,
            "StaffID": 127,
            "StatID": 8,
            "Val": 63
        },
        {
            "Max": 100,
            "StaffID": 127,
            "StatID": 9,
            "Val": 81
        },
        {
            "Max": 100,
            "StaffID": 127,
            "StatID": 10,
            "Val": 76
        },
        {
            "Max": 100,
            "StaffID": 130,
            "StatID": 2,
            "Val": 72
        },
        {
            "Max": 100,
            "StaffID": 130,
            "StatID": 3,
            "Val": 78
        },
        {
            "Max": 100,
            "StaffID": 130,
            "StatID": 4,
            "Val": 82
        },
        {
            "Max": 100,
            "StaffID": 130,
            "StatID": 5,
            "Val": 70
        },
        {
            "Max": 100,
            "StaffID": 130,
            "StatID": 6,
            "Val": 72
        },
        {
            "Max": 100,
            "StaffID": 130,
            "StatID": 7,
            "Val": 73
        },
        {
            "Max": 100,
            "StaffID": 130,
            "StatID": 8,
            "Val": 68
        },
        {
            "Max": 100,
            "StaffID": 130,
            "StatID": 9,
            "Val": 72
        },
        {
            "Max": 100,
            "StaffID": 130,
            "StatID": 10,
            "Val": 74
        },
        {
            "Max": 100,
            "StaffID": 135,
            "StatID": 2,
            "Val": 79
        },
        {
            "Max": 100,
            "StaffID": 135,
            "StatID": 3,
            "Val": 76
        },
        {
            "Max": 100,
            "StaffID": 135,
            "StatID": 4,
            "Val": 80
        },
        {
            "Max": 100,
            "StaffID": 135,
            "StatID": 5,
            "Val": 69
        },
        {
            "Max": 100,
            "StaffID": 135,
            "StatID": 6,
            "Val": 75
        },
        {
            "Max": 100,
            "StaffID": 135,
            "StatID": 7,
            "Val": 65
        },
        {
            "Max": 100,
            "StaffID": 135,
            "StatID": 8,
            "Val": 75
        },
        {
            "Max": 100,
            "StaffID": 135,
            "StatID": 9,
            "Val": 83
        },
        {
            "Max": 100,
            "StaffID": 135,
            "StatID": 10,
            "Val": 72
        },
        {
            "Max": 100,
            "StaffID": 142,
            "StatID": 2,
            "Val": 86
        },
        {
            "Max": 100,
            "StaffID": 142,
            "StatID": 3,
            "Val": 83
        },
        {
            "Max": 100,
            "StaffID": 142,
            "StatID": 4,
            "Val": 81
        },
        {
            "Max": 100,
            "StaffID": 142,
            "StatID": 5,
            "Val": 71
        },
        {
            "Max": 100,
            "StaffID": 142,
            "StatID": 6,
            "Val": 81
        },
        {
            "Max": 100,
            "StaffID": 142,
            "StatID": 7,
            "Val": 80
        },
        {
            "Max": 100,
            "StaffID": 142,
            "StatID": 8,
            "Val": 68
        },
        {
            "Max": 100,
            "StaffID": 142,
            "StatID": 9,
            "Val": 87
        },
        {
            "Max": 100,
            "StaffID": 142,
            "StatID": 10,
            "Val": 69
        },
        {
            "Max": 100,
            "StaffID": 144,
            "StatID": 2,
            "Val": 79
        },
        {
            "Max": 100,
            "StaffID": 144,
            "StatID": 3,
            "Val": 72
        },
        {
            "Max": 100,
            "StaffID": 144,
            "StatID": 4,
            "Val": 83
        },
        {
            "Max": 100,
            "StaffID": 144,
            "StatID": 5,
            "Val": 76
        },
        {
            "Max": 100,
            "StaffID": 144,
            "StatID": 6,
            "Val": 72
        },
        {
            "Max": 100,
            "StaffID": 144,
            "StatID": 7,
            "Val": 73
        },
        {
            "Max": 100,
            "StaffID": 144,
            "StatID": 8,
            "Val": 74
        },
        {
            "Max": 100,
            "StaffID": 144,
            "StatID": 9,
            "Val": 73
        },
        {
            "Max": 100,
            "StaffID": 144,
            "StatID": 10,
            "Val": 72
        },
        {
            "Max": 100,
            "StaffID": 242,
            "StatID": 2,
            "Val": 79
        },
        {
            "Max": 100,
            "StaffID": 242,
            "StatID": 3,
            "Val": 69
        },
        {
            "Max": 100,
            "StaffID": 242,
            "StatID": 4,
            "Val": 86
        },
        {
            "Max": 100,
            "StaffID": 242,
            "StatID": 5,
            "Val": 80
        },
        {
            "Max": 100,
            "StaffID": 242,
            "StatID": 6,
            "Val": 65
        },
        {
            "Max": 100,
            "StaffID": 242,
            "StatID": 7,
            "Val": 71
        },
        {
            "Max": 100,
            "StaffID": 242,
            "StatID": 8,
            "Val": 77
        },
        {
            "Max": 100,
            "StaffID": 242,
            "StatID": 9,
            "Val": 67
        },
        {
            "Max": 100,
            "StaffID": 242,
            "StatID": 10,
            "Val": 73
        },
        {
            "Max": 100,
            "StaffID": 245,
            "StatID": 2,
            "Val": 65
        },
        {
            "Max": 100,
            "StaffID": 245,
            "StatID": 3,
            "Val": 72
        },
        {
            "Max": 100,
            "StaffID": 245,
            "StatID": 4,
            "Val": 73
        },
        {
            "Max": 100,
            "StaffID": 245,
            "StatID": 5,
            "Val": 72
        },
        {
            "Max": 100,
            "StaffID": 245,
            "StatID": 6,
            "Val": 65
        },
        {
            "Max": 100,
            "StaffID": 245,
            "StatID": 7,
            "Val": 70
        },
        {
            "Max": 100,
            "StaffID": 245,
            "StatID": 8,
            "Val": 68
        },
        {
            "Max": 100,
            "StaffID": 245,
            "StatID": 9,
            "Val": 70
        },
        {
            "Max": 100,
            "StaffID": 245,
            "StatID": 10,
            "Val": 70
        },
        {
            "Max": 100,
            "StaffID": 248,
            "StatID": 2,
            "Val": 71
        },
        {
            "Max": 100,
            "StaffID": 248,
            "StatID": 3,
            "Val": 77
        },
        {
            "Max": 100,
            "StaffID": 248,
            "StatID": 4,
            "Val": 80
        },
        {
            "Max": 100,
            "StaffID": 248,
            "StatID": 5,
            "Val": 77
        },
        {
            "Max": 100,
            "StaffID": 248,
            "StatID": 6,
            "Val": 78
        },
        {
            "Max": 100,
            "StaffID": 248,
            "StatID": 7,
            "Val": 78
        },
        {
            "Max": 100,
            "StaffID": 248,
            "StatID": 8,
            "Val": 81
        },
        {
            "Max": 100,
            "StaffID": 248,
            "StatID": 9,
            "Val": 80
        },
        {
            "Max": 100,
            "StaffID": 248,
            "StatID": 10,
            "Val": 82
        },
        {
            "Max": 100,
            "StaffID": 252,
            "StatID": 2,
            "Val": 71
        },
        {
            "Max": 100,
            "StaffID": 252,
            "StatID": 3,
            "Val": 68
        },
        {
            "Max": 100,
            "StaffID": 252,
            "StatID": 4,
            "Val": 73
        },
        {
            "Max": 100,
            "StaffID": 252,
            "StatID": 5,
            "Val": 72
        },
        {
            "Max": 100,
            "StaffID": 252,
            "StatID": 6,
            "Val": 66
        },
        {
            "Max": 100,
            "StaffID": 252,
            "StatID": 7,
            "Val": 68
        },
        {
            "Max": 100,
            "StaffID": 252,
            "StatID": 8,
            "Val": 69
        },
        {
            "Max": 100,
            "StaffID": 252,
            "StatID": 9,
            "Val": 67
        },
        {
            "Max": 100,
            "StaffID": 252,
            "StatID": 10,
            "Val": 71
        },
        {
            "Max": 100,
            "StaffID": 255,
            "StatID": 2,
            "Val": 81
        },
        {
            "Max": 100,
            "StaffID": 255,
            "StatID": 3,
            "Val": 78
        },
        {
            "Max": 100,
            "StaffID": 255,
            "StatID": 4,
            "Val": 83
        },
        {
            "Max": 100,
            "StaffID": 255,
            "StatID": 5,
            "Val": 78
        },
        {
            "Max": 100,
            "StaffID": 255,
            "StatID": 6,
            "Val": 91
        },
        {
            "Max": 100,
            "StaffID": 255,
            "StatID": 7,
            "Val": 79
        },
        {
            "Max": 100,
            "StaffID": 255,
            "StatID": 8,
            "Val": 76
        },
        {
            "Max": 100,
            "StaffID": 255,
            "StatID": 9,
            "Val": 83
        },
        {
            "Max": 100,
            "StaffID": 255,
            "StatID": 10,
            "Val": 79
        },
        {
            "Max": 100,
            "StaffID": 279,
            "StatID": 2,
            "Val": 77
        },
        {
            "Max": 100,
            "StaffID": 279,
            "StatID": 3,
            "Val": 77
        },
        {
            "Max": 100,
            "StaffID": 279,
            "StatID": 4,
            "Val": 78
        },
        {
            "Max": 100,
            "StaffID": 279,
            "StatID": 5,
            "Val": 73
        },
        {
            "Max": 100,
            "StaffID": 279,
            "StatID": 6,
            "Val": 76
        },
        {
            "Max": 100,
            "StaffID": 279,
            "StatID": 7,
            "Val": 73
        },
        {
            "Max": 100,
            "StaffID": 279,
            "StatID": 8,
            "Val": 81
        },
        {
            "Max": 100,
            "StaffID": 279,
            "StatID": 9,
            "Val": 77
        },
        {
            "Max": 100,
            "StaffID": 279,
            "StatID": 10,
            "Val": 83
        },
        {
            "Max": 100,
            "StaffID": 280,
            "StatID": 2,
            "Val": 78
        },
        {
            "Max": 100,
            "StaffID": 280,
            "StatID": 3,
            "Val": 76
        },
        {
            "Max": 100,
            "StaffID": 280,
            "StatID": 4,
            "Val": 72
        },
        {
            "Max": 100,
            "StaffID": 280,
            "StatID": 5,
            "Val": 61
        },
        {
            "Max": 100,
            "StaffID": 280,
            "StatID": 6,
            "Val": 77
        },
        {
            "Max": 100,
            "StaffID": 280,
            "StatID": 7,
            "Val": 62
        },
        {
            "Max": 100,
            "StaffID": 280,
            "StatID": 8,
            "Val": 72
        },
        {
            "Max": 100,
            "StaffID": 280,
            "StatID": 9,
            "Val": 81
        },
        {
            "Max": 100,
            "StaffID": 280,
            "StatID": 10,
            "Val": 55
        },
        {
            "Max": 100,
            "StaffID": 281,
            "StatID": 2,
            "Val": 77
        },
        {
            "Max": 100,
            "StaffID": 281,
            "StatID": 3,
            "Val": 74
        },
        {
            "Max": 100,
            "StaffID": 281,
            "StatID": 4,
            "Val": 73
        },
        {
            "Max": 100,
            "StaffID": 281,
            "StatID": 5,
            "Val": 73
        },
        {
            "Max": 100,
            "StaffID": 281,
            "StatID": 6,
            "Val": 77
        },
        {
            "Max": 100,
            "StaffID": 281,
            "StatID": 7,
            "Val": 73
        },
        {
            "Max": 100,
            "StaffID": 281,
            "StatID": 8,
            "Val": 78
        },
        {
            "Max": 100,
            "StaffID": 281,
            "StatID": 9,
            "Val": 79
        },
        {
            "Max": 100,
            "StaffID": 281,
            "StatID": 10,
            "Val": 76
        },
        {
            "Max": 100,
            "StaffID": 282,
            "StatID": 2,
            "Val": 73
        },
        {
            "Max": 100,
            "StaffID": 282,
            "StatID": 3,
            "Val": 75
        },
        {
            "Max": 100,
            "StaffID": 282,
            "StatID": 4,
            "Val": 62
        },
        {
            "Max": 100,
            "StaffID": 282,
            "StatID": 5,
            "Val": 66
        },
        {
            "Max": 100,
            "StaffID": 282,
            "StatID": 6,
            "Val": 76
        },
        {
            "Max": 100,
            "StaffID": 282,
            "StatID": 7,
            "Val": 59
        },
        {
            "Max": 100,
            "StaffID": 282,
            "StatID": 8,
            "Val": 73
        },
        {
            "Max": 100,
            "StaffID": 282,
            "StatID": 9,
            "Val": 71
        },
        {
            "Max": 100,
            "StaffID": 282,
            "StatID": 10,
            "Val": 71
        },
        {
            "Max": 100,
            "StaffID": 283,
            "StatID": 2,
            "Val": 64
        },
        {
            "Max": 100,
            "StaffID": 283,
            "StatID": 3,
            "Val": 61
        },
        {
            "Max": 100,
            "StaffID": 283,
            "StatID": 4,
            "Val": 61
        },
        {
            "Max": 100,
            "StaffID": 283,
            "StatID": 5,
            "Val": 73
        },
        {
            "Max": 100,
            "StaffID": 283,
            "StatID": 6,
            "Val": 56
        },
        {
            "Max": 100,
            "StaffID": 283,
            "StatID": 7,
            "Val": 51
        },
        {
            "Max": 100,
            "StaffID": 283,
            "StatID": 8,
            "Val": 64
        },
        {
            "Max": 100,
            "StaffID": 283,
            "StatID": 9,
            "Val": 74
        },
        {
            "Max": 100,
            "StaffID": 283,
            "StatID": 10,
            "Val": 55
        },
        {
            "Max": 100,
            "StaffID": 284,
            "StatID": 2,
            "Val": 65
        },
        {
            "Max": 100,
            "StaffID": 284,
            "StatID": 3,
            "Val": 60
        },
        {
            "Max": 100,
            "StaffID": 284,
            "StatID": 4,
            "Val": 79
        },
        {
            "Max": 100,
            "StaffID": 284,
            "StatID": 5,
            "Val": 68
        },
        {
            "Max": 100,
            "StaffID": 284,
            "StatID": 6,
            "Val": 71
        },
        {
            "Max": 100,
            "StaffID": 284,
            "StatID": 7,
            "Val": 55
        },
        {
            "Max": 100,
            "StaffID": 284,
            "StatID": 8,
            "Val": 77
        },
        {
            "Max": 100,
            "StaffID": 284,
            "StatID": 9,
            "Val": 73
        },
        {
            "Max": 100,
            "StaffID": 284,
            "StatID": 10,
            "Val": 65
        },
        {
            "Max": 100,
            "StaffID": 285,
            "StatID": 2,
            "Val": 81
        },
        {
            "Max": 100,
            "StaffID": 285,
            "StatID": 3,
            "Val": 75
        },
        {
            "Max": 100,
            "StaffID": 285,
            "StatID": 4,
            "Val": 77
        },
        {
            "Max": 100,
            "StaffID": 285,
            "StatID": 5,
            "Val": 75
        },
        {
            "Max": 100,
            "StaffID": 285,
            "StatID": 6,
            "Val": 75
        },
        {
            "Max": 100,
            "StaffID": 285,
            "StatID": 7,
            "Val": 74
        },
        {
            "Max": 100,
            "StaffID": 285,
            "StatID": 8,
            "Val": 81
        },
        {
            "Max": 100,
            "StaffID": 285,
            "StatID": 9,
            "Val": 75
        },
        {
            "Max": 100,
            "StaffID": 285,
            "StatID": 10,
            "Val": 80
        },
        {
            "Max": 100,
            "StaffID": 286,
            "StatID": 2,
            "Val": 61
        },
        {
            "Max": 100,
            "StaffID": 286,
            "StatID": 3,
            "Val": 60
        },
        {
            "Max": 100,
            "StaffID": 286,
            "StatID": 4,
            "Val": 62
        },
        {
            "Max": 100,
            "StaffID": 286,
            "StatID": 5,
            "Val": 56
        },
        {
            "Max": 100,
            "StaffID": 286,
            "StatID": 6,
            "Val": 62
        },
        {
            "Max": 100,
            "StaffID": 286,
            "StatID": 7,
            "Val": 57
        },
        {
            "Max": 100,
            "StaffID": 286,
            "StatID": 8,
            "Val": 59
        },
        {
            "Max": 100,
            "StaffID": 286,
            "StatID": 9,
            "Val": 74
        },
        {
            "Max": 100,
            "StaffID": 286,
            "StatID": 10,
            "Val": 73
        },
        {
            "Max": 100,
            "StaffID": 288,
            "StatID": 2,
            "Val": 68
        },
        {
            "Max": 100,
            "StaffID": 288,
            "StatID": 3,
            "Val": 69
        },
        {
            "Max": 100,
            "StaffID": 288,
            "StatID": 4,
            "Val": 75
        },
        {
            "Max": 100,
            "StaffID": 288,
            "StatID": 5,
            "Val": 56
        },
        {
            "Max": 100,
            "StaffID": 288,
            "StatID": 6,
            "Val": 64
        },
        {
            "Max": 100,
            "StaffID": 288,
            "StatID": 7,
            "Val": 53
        },
        {
            "Max": 100,
            "StaffID": 288,
            "StatID": 8,
            "Val": 65
        },
        {
            "Max": 100,
            "StaffID": 288,
            "StatID": 9,
            "Val": 65
        },
        {
            "Max": 100,
            "StaffID": 288,
            "StatID": 10,
            "Val": 69
        },
        {
            "Max": 100,
            "StaffID": 289,
            "StatID": 2,
            "Val": 75
        },
        {
            "Max": 100,
            "StaffID": 289,
            "StatID": 3,
            "Val": 72
        },
        {
            "Max": 100,
            "StaffID": 289,
            "StatID": 4,
            "Val": 77
        },
        {
            "Max": 100,
            "StaffID": 289,
            "StatID": 5,
            "Val": 63
        },
        {
            "Max": 100,
            "StaffID": 289,
            "StatID": 6,
            "Val": 73
        },
        {
            "Max": 100,
            "StaffID": 289,
            "StatID": 7,
            "Val": 66
        },
        {
            "Max": 100,
            "StaffID": 289,
            "StatID": 8,
            "Val": 73
        },
        {
            "Max": 100,
            "StaffID": 289,
            "StatID": 9,
            "Val": 55
        },
        {
            "Max": 100,
            "StaffID": 289,
            "StatID": 10,
            "Val": 69
        },
        {
            "Max": 100,
            "StaffID": 301,
            "StatID": 2,
            "Val": 65
        },
        {
            "Max": 100,
            "StaffID": 301,
            "StatID": 3,
            "Val": 66
        },
        {
            "Max": 100,
            "StaffID": 301,
            "StatID": 4,
            "Val": 72
        },
        {
            "Max": 100,
            "StaffID": 301,
            "StatID": 5,
            "Val": 63
        },
        {
            "Max": 100,
            "StaffID": 301,
            "StatID": 6,
            "Val": 62
        },
        {
            "Max": 100,
            "StaffID": 301,
            "StatID": 7,
            "Val": 51
        },
        {
            "Max": 100,
            "StaffID": 301,
            "StatID": 8,
            "Val": 73
        },
        {
            "Max": 100,
            "StaffID": 301,
            "StatID": 9,
            "Val": 47
        },
        {
            "Max": 100,
            "StaffID": 301,
            "StatID": 10,
            "Val": 68
        },
        {
            "Max": 100,
            "StaffID": 305,
            "StatID": 2,
            "Val": 65
        },
        {
            "Max": 100,
            "StaffID": 305,
            "StatID": 3,
            "Val": 68
        },
        {
            "Max": 100,
            "StaffID": 305,
            "StatID": 4,
            "Val": 68
        },
        {
            "Max": 100,
            "StaffID": 305,
            "StatID": 5,
            "Val": 71
        },
        {
            "Max": 100,
            "StaffID": 305,
            "StatID": 6,
            "Val": 64
        },
        {
            "Max": 100,
            "StaffID": 305,
            "StatID": 7,
            "Val": 69
        },
        {
            "Max": 100,
            "StaffID": 305,
            "StatID": 8,
            "Val": 67
        },
        {
            "Max": 100,
            "StaffID": 305,
            "StatID": 9,
            "Val": 68
        },
        {
            "Max": 100,
            "StaffID": 305,
            "StatID": 10,
            "Val": 56
        },
        {
            "Max": 100,
            "StaffID": 306,
            "StatID": 2,
            "Val": 60
        },
        {
            "Max": 100,
            "StaffID": 306,
            "StatID": 3,
            "Val": 57
        },
        {
            "Max": 100,
            "StaffID": 306,
            "StatID": 4,
            "Val": 70
        },
        {
            "Max": 100,
            "StaffID": 306,
            "StatID": 5,
            "Val": 69
        },
        {
            "Max": 100,
            "StaffID": 306,
            "StatID": 6,
            "Val": 71
        },
        {
            "Max": 100,
            "StaffID": 306,
            "StatID": 7,
            "Val": 62
        },
        {
            "Max": 100,
            "StaffID": 306,
            "StatID": 8,
            "Val": 72
        },
        {
            "Max": 100,
            "StaffID": 306,
            "StatID": 9,
            "Val": 58
        },
        {
            "Max": 100,
            "StaffID": 306,
            "StatID": 10,
            "Val": 68
        },
        {
            "Max": 100,
            "StaffID": 308,
            "StatID": 2,
            "Val": 63
        },
        {
            "Max": 100,
            "StaffID": 308,
            "StatID": 3,
            "Val": 62
        },
        {
            "Max": 100,
            "StaffID": 308,
            "StatID": 4,
            "Val": 59
        },
        {
            "Max": 100,
            "StaffID": 308,
            "StatID": 5,
            "Val": 63
        },
        {
            "Max": 100,
            "StaffID": 308,
            "StatID": 6,
            "Val": 57
        },
        {
            "Max": 100,
            "StaffID": 308,
            "StatID": 7,
            "Val": 58
        },
        {
            "Max": 100,
            "StaffID": 308,
            "StatID": 8,
            "Val": 64
        },
        {
            "Max": 100,
            "StaffID": 308,
            "StatID": 9,
            "Val": 56
        },
        {
            "Max": 100,
            "StaffID": 308,
            "StatID": 10,
            "Val": 68
        },
        {
            "Max": 100,
            "StaffID": 322,
            "StatID": 2,
            "Val": 69
        },
        {
            "Max": 100,
            "StaffID": 322,
            "StatID": 3,
            "Val": 73
        },
        {
            "Max": 100,
            "StaffID": 322,
            "StatID": 4,
            "Val": 62
        },
        {
            "Max": 100,
            "StaffID": 322,
            "StatID": 5,
            "Val": 69
        },
        {
            "Max": 100,
            "StaffID": 322,
            "StatID": 6,
            "Val": 76
        },
        {
            "Max": 100,
            "StaffID": 322,
            "StatID": 7,
            "Val": 67
        },
        {
            "Max": 100,
            "StaffID": 322,
            "StatID": 8,
            "Val": 64
        },
        {
            "Max": 100,
            "StaffID": 322,
            "StatID": 9,
            "Val": 72
        },
        {
            "Max": 100,
            "StaffID": 322,
            "StatID": 10,
            "Val": 71
        },
        {
            "Max": 100,
            "StaffID": 373,
            "StatID": 2,
            "Val": 74
        },
        {
            "Max": 100,
            "StaffID": 373,
            "StatID": 3,
            "Val": 69
        },
        {
            "Max": 100,
            "StaffID": 373,
            "StatID": 4,
            "Val": 60
        },
        {
            "Max": 100,
            "StaffID": 373,
            "StatID": 5,
            "Val": 80
        },
        {
            "Max": 100,
            "StaffID": 373,
            "StatID": 6,
            "Val": 64
        },
        {
            "Max": 100,
            "StaffID": 373,
            "StatID": 7,
            "Val": 65
        },
        {
            "Max": 100,
            "StaffID": 373,
            "StatID": 8,
            "Val": 75
        },
        {
            "Max": 100,
            "StaffID": 373,
            "StatID": 9,
            "Val": 74
        },
        {
            "Max": 100,
            "StaffID": 373,
            "StatID": 10,
            "Val": 70
        },
        {
            "Max": 100,
            "StaffID": 374,
            "StatID": 2,
            "Val": 65
        },
        {
            "Max": 100,
            "StaffID": 374,
            "StatID": 3,
            "Val": 63
        },
        {
            "Max": 100,
            "StaffID": 374,
            "StatID": 4,
            "Val": 65
        },
        {
            "Max": 100,
            "StaffID": 374,
            "StatID": 5,
            "Val": 64
        },
        {
            "Max": 100,
            "StaffID": 374,
            "StatID": 6,
            "Val": 69
        },
        {
            "Max": 100,
            "StaffID": 374,
            "StatID": 7,
            "Val": 65
        },
        {
            "Max": 100,
            "StaffID": 374,
            "StatID": 8,
            "Val": 66
        },
        {
            "Max": 100,
            "StaffID": 374,
            "StatID": 9,
            "Val": 67
        },
        {
            "Max": 100,
            "StaffID": 374,
            "StatID": 10,
            "Val": 66
        },
        {
            "Max": 100,
            "StaffID": 375,
            "StatID": 2,
            "Val": 63
        },
        {
            "Max": 100,
            "StaffID": 375,
            "StatID": 3,
            "Val": 63
        },
        {
            "Max": 100,
            "StaffID": 375,
            "StatID": 4,
            "Val": 64
        },
        {
            "Max": 100,
            "StaffID": 375,
            "StatID": 5,
            "Val": 62
        },
        {
            "Max": 100,
            "StaffID": 375,
            "StatID": 6,
            "Val": 72
        },
        {
            "Max": 100,
            "StaffID": 375,
            "StatID": 7,
            "Val": 68
        },
        {
            "Max": 100,
            "StaffID": 375,
            "StatID": 8,
            "Val": 67
        },
        {
            "Max": 100,
            "StaffID": 375,
            "StatID": 9,
            "Val": 64
        },
        {
            "Max": 100,
            "StaffID": 375,
            "StatID": 10,
            "Val": 65
        },
        {
            "Max": 100,
            "StaffID": 376,
            "StatID": 2,
            "Val": 75
        },
        {
            "Max": 100,
            "StaffID": 376,
            "StatID": 3,
            "Val": 85
        },
        {
            "Max": 100,
            "StaffID": 376,
            "StatID": 4,
            "Val": 62
        },
        {
            "Max": 100,
            "StaffID": 376,
            "StatID": 5,
            "Val": 78
        },
        {
            "Max": 100,
            "StaffID": 376,
            "StatID": 6,
            "Val": 81
        },
        {
            "Max": 100,
            "StaffID": 376,
            "StatID": 7,
            "Val": 81
        },
        {
            "Max": 100,
            "StaffID": 376,
            "StatID": 8,
            "Val": 80
        },
        {
            "Max": 100,
            "StaffID": 376,
            "StatID": 9,
            "Val": 80
        },
        {
            "Max": 100,
            "StaffID": 376,
            "StatID": 10,
            "Val": 80
        },
        {
            "Max": 100,
            "StaffID": 377,
            "StatID": 2,
            "Val": 67
        },
        {
            "Max": 100,
            "StaffID": 377,
            "StatID": 3,
            "Val": 69
        },
        {
            "Max": 100,
            "StaffID": 377,
            "StatID": 4,
            "Val": 68
        },
        {
            "Max": 100,
            "StaffID": 377,
            "StatID": 5,
            "Val": 65
        },
        {
            "Max": 100,
            "StaffID": 377,
            "StatID": 6,
            "Val": 70
        },
        {
            "Max": 100,
            "StaffID": 377,
            "StatID": 7,
            "Val": 66
        },
        {
            "Max": 100,
            "StaffID": 377,
            "StatID": 8,
            "Val": 67
        },
        {
            "Max": 100,
            "StaffID": 377,
            "StatID": 9,
            "Val": 73
        },
        {
            "Max": 100,
            "StaffID": 377,
            "StatID": 10,
            "Val": 72
        },
        {
            "Max": 100,
            "StaffID": 378,
            "StatID": 2,
            "Val": 73
        },
        {
            "Max": 100,
            "StaffID": 378,
            "StatID": 3,
            "Val": 65
        },
        {
            "Max": 100,
            "StaffID": 378,
            "StatID": 4,
            "Val": 69
        },
        {
            "Max": 100,
            "StaffID": 378,
            "StatID": 5,
            "Val": 71
        },
        {
            "Max": 100,
            "StaffID": 378,
            "StatID": 6,
            "Val": 71
        },
        {
            "Max": 100,
            "StaffID": 378,
            "StatID": 7,
            "Val": 77
        },
        {
            "Max": 100,
            "StaffID": 378,
            "StatID": 8,
            "Val": 78
        },
        {
            "Max": 100,
            "StaffID": 378,
            "StatID": 9,
            "Val": 68
        },
        {
            "Max": 100,
            "StaffID": 378,
            "StatID": 10,
            "Val": 68
        },
        {
            "Max": 100,
            "StaffID": 379,
            "StatID": 2,
            "Val": 66
        },
        {
            "Max": 100,
            "StaffID": 379,
            "StatID": 3,
            "Val": 61
        },
        {
            "Max": 100,
            "StaffID": 379,
            "StatID": 4,
            "Val": 67
        },
        {
            "Max": 100,
            "StaffID": 379,
            "StatID": 5,
            "Val": 58
        },
        {
            "Max": 100,
            "StaffID": 379,
            "StatID": 6,
            "Val": 66
        },
        {
            "Max": 100,
            "StaffID": 379,
            "StatID": 7,
            "Val": 68
        },
        {
            "Max": 100,
            "StaffID": 379,
            "StatID": 8,
            "Val": 68
        },
        {
            "Max": 100,
            "StaffID": 379,
            "StatID": 9,
            "Val": 65
        },
        {
            "Max": 100,
            "StaffID": 379,
            "StatID": 10,
            "Val": 67
        },
        {
            "Max": 100,
            "StaffID": 380,
            "StatID": 2,
            "Val": 63
        },
        {
            "Max": 100,
            "StaffID": 380,
            "StatID": 3,
            "Val": 68
        },
        {
            "Max": 100,
            "StaffID": 380,
            "StatID": 4,
            "Val": 68
        },
        {
            "Max": 100,
            "StaffID": 380,
            "StatID": 5,
            "Val": 64
        },
        {
            "Max": 100,
            "StaffID": 380,
            "StatID": 6,
            "Val": 67
        },
        {
            "Max": 100,
            "StaffID": 380,
            "StatID": 7,
            "Val": 72
        },
        {
            "Max": 100,
            "StaffID": 380,
            "StatID": 8,
            "Val": 64
        },
        {
            "Max": 100,
            "StaffID": 380,
            "StatID": 9,
            "Val": 60
        },
        {
            "Max": 100,
            "StaffID": 380,
            "StatID": 10,
            "Val": 71
        },
        {
            "Max": 100,
            "StaffID": 381,
            "StatID": 2,
            "Val": 63
        },
        {
            "Max": 100,
            "StaffID": 381,
            "StatID": 3,
            "Val": 64
        },
        {
            "Max": 100,
            "StaffID": 381,
            "StatID": 4,
            "Val": 68
        },
        {
            "Max": 100,
            "StaffID": 381,
            "StatID": 5,
            "Val": 57
        },
        {
            "Max": 100,
            "StaffID": 381,
            "StatID": 6,
            "Val": 66
        },
        {
            "Max": 100,
            "StaffID": 381,
            "StatID": 7,
            "Val": 66
        },
        {
            "Max": 100,
            "StaffID": 381,
            "StatID": 8,
            "Val": 66
        },
        {
            "Max": 100,
            "StaffID": 381,
            "StatID": 9,
            "Val": 72
        },
        {
            "Max": 100,
            "StaffID": 381,
            "StatID": 10,
            "Val": 68
        },
        {
            "Max": 100,
            "StaffID": 382,
            "StatID": 2,
            "Val": 65
        },
        {
            "Max": 100,
            "StaffID": 382,
            "StatID": 3,
            "Val": 63
        },
        {
            "Max": 100,
            "StaffID": 382,
            "StatID": 4,
            "Val": 61
        },
        {
            "Max": 100,
            "StaffID": 382,
            "StatID": 5,
            "Val": 64
        },
        {
            "Max": 100,
            "StaffID": 382,
            "StatID": 6,
            "Val": 62
        },
        {
            "Max": 100,
            "StaffID": 382,
            "StatID": 7,
            "Val": 57
        },
        {
            "Max": 100,
            "StaffID": 382,
            "StatID": 8,
            "Val": 65
        },
        {
            "Max": 100,
            "StaffID": 382,
            "StatID": 9,
            "Val": 60
        },
        {
            "Max": 100,
            "StaffID": 382,
            "StatID": 10,
            "Val": 63
        },
        {
            "Max": 100,
            "StaffID": 383,
            "StatID": 2,
            "Val": 57
        },
        {
            "Max": 100,
            "StaffID": 383,
            "StatID": 3,
            "Val": 61
        },
        {
            "Max": 100,
            "StaffID": 383,
            "StatID": 4,
            "Val": 71
        },
        {
            "Max": 100,
            "StaffID": 383,
            "StatID": 5,
            "Val": 59
        },
        {
            "Max": 100,
            "StaffID": 383,
            "StatID": 6,
            "Val": 67
        },
        {
            "Max": 100,
            "StaffID": 383,
            "StatID": 7,
            "Val": 67
        },
        {
            "Max": 100,
            "StaffID": 383,
            "StatID": 8,
            "Val": 65
        },
        {
            "Max": 100,
            "StaffID": 383,
            "StatID": 9,
            "Val": 67
        },
        {
            "Max": 100,
            "StaffID": 383,
            "StatID": 10,
            "Val": 66
        },
        {
            "Max": 100,
            "StaffID": 384,
            "StatID": 2,
            "Val": 62
        },
        {
            "Max": 100,
            "StaffID": 384,
            "StatID": 3,
            "Val": 62
        },
        {
            "Max": 100,
            "StaffID": 384,
            "StatID": 4,
            "Val": 64
        },
        {
            "Max": 100,
            "StaffID": 384,
            "StatID": 5,
            "Val": 58
        },
        {
            "Max": 100,
            "StaffID": 384,
            "StatID": 6,
            "Val": 67
        },
        {
            "Max": 100,
            "StaffID": 384,
            "StatID": 7,
            "Val": 65
        },
        {
            "Max": 100,
            "StaffID": 384,
            "StatID": 8,
            "Val": 63
        },
        {
            "Max": 100,
            "StaffID": 384,
            "StatID": 9,
            "Val": 63
        },
        {
            "Max": 100,
            "StaffID": 384,
            "StatID": 10,
            "Val": 64
        },
        {
            "Max": 100,
            "StaffID": 385,
            "StatID": 2,
            "Val": 55
        },
        {
            "Max": 100,
            "StaffID": 385,
            "StatID": 3,
            "Val": 60
        },
        {
            "Max": 100,
            "StaffID": 385,
            "StatID": 4,
            "Val": 61
        },
        {
            "Max": 100,
            "StaffID": 385,
            "StatID": 5,
            "Val": 48
        },
        {
            "Max": 100,
            "StaffID": 385,
            "StatID": 6,
            "Val": 65
        },
        {
            "Max": 100,
            "StaffID": 385,
            "StatID": 7,
            "Val": 61
        },
        {
            "Max": 100,
            "StaffID": 385,
            "StatID": 8,
            "Val": 60
        },
        {
            "Max": 100,
            "StaffID": 385,
            "StatID": 9,
            "Val": 62
        },
        {
            "Max": 100,
            "StaffID": 385,
            "StatID": 10,
            "Val": 63
        },
        {
            "Max": 100,
            "StaffID": 386,
            "StatID": 2,
            "Val": 67
        },
        {
            "Max": 100,
            "StaffID": 386,
            "StatID": 3,
            "Val": 58
        },
        {
            "Max": 100,
            "StaffID": 386,
            "StatID": 4,
            "Val": 60
        },
        {
            "Max": 100,
            "StaffID": 386,
            "StatID": 5,
            "Val": 66
        },
        {
            "Max": 100,
            "StaffID": 386,
            "StatID": 6,
            "Val": 66
        },
        {
            "Max": 100,
            "StaffID": 386,
            "StatID": 7,
            "Val": 64
        },
        {
            "Max": 100,
            "StaffID": 386,
            "StatID": 8,
            "Val": 75
        },
        {
            "Max": 100,
            "StaffID": 386,
            "StatID": 9,
            "Val": 61
        },
        {
            "Max": 100,
            "StaffID": 386,
            "StatID": 10,
            "Val": 59
        },
        {
            "Max": 100,
            "StaffID": 387,
            "StatID": 2,
            "Val": 66
        },
        {
            "Max": 100,
            "StaffID": 387,
            "StatID": 3,
            "Val": 66
        },
        {
            "Max": 100,
            "StaffID": 387,
            "StatID": 4,
            "Val": 66
        },
        {
            "Max": 100,
            "StaffID": 387,
            "StatID": 5,
            "Val": 63
        },
        {
            "Max": 100,
            "StaffID": 387,
            "StatID": 6,
            "Val": 64
        },
        {
            "Max": 100,
            "StaffID": 387,
            "StatID": 7,
            "Val": 66
        },
        {
            "Max": 100,
            "StaffID": 387,
            "StatID": 8,
            "Val": 68
        },
        {
            "Max": 100,
            "StaffID": 387,
            "StatID": 9,
            "Val": 67
        },
        {
            "Max": 100,
            "StaffID": 387,
            "StatID": 10,
            "Val": 64
        },
        {
            "Max": 100,
            "StaffID": 388,
            "StatID": 2,
            "Val": 57
        },
        {
            "Max": 100,
            "StaffID": 388,
            "StatID": 3,
            "Val": 61
        },
        {
            "Max": 100,
            "StaffID": 388,
            "StatID": 4,
            "Val": 69
        },
        {
            "Max": 100,
            "StaffID": 388,
            "StatID": 5,
            "Val": 59
        },
        {
            "Max": 100,
            "StaffID": 388,
            "StatID": 6,
            "Val": 65
        },
        {
            "Max": 100,
            "StaffID": 388,
            "StatID": 7,
            "Val": 62
        },
        {
            "Max": 100,
            "StaffID": 388,
            "StatID": 8,
            "Val": 61
        },
        {
            "Max": 100,
            "StaffID": 388,
            "StatID": 9,
            "Val": 63
        },
        {
            "Max": 100,
            "StaffID": 388,
            "StatID": 10,
            "Val": 57
        },
        {
            "Max": 100,
            "StaffID": 390,
            "StatID": 2,
            "Val": 61
        },
        {
            "Max": 100,
            "StaffID": 390,
            "StatID": 3,
            "Val": 62
        },
        {
            "Max": 100,
            "StaffID": 390,
            "StatID": 4,
            "Val": 57
        },
        {
            "Max": 100,
            "StaffID": 390,
            "StatID": 5,
            "Val": 56
        },
        {
            "Max": 100,
            "StaffID": 390,
            "StatID": 6,
            "Val": 60
        },
        {
            "Max": 100,
            "StaffID": 390,
            "StatID": 7,
            "Val": 65
        },
        {
            "Max": 100,
            "StaffID": 390,
            "StatID": 8,
            "Val": 67
        },
        {
            "Max": 100,
            "StaffID": 390,
            "StatID": 9,
            "Val": 59
        },
        {
            "Max": 100,
            "StaffID": 390,
            "StatID": 10,
            "Val": 63
        },
        {
            "Max": 100,
            "StaffID": 394,
            "StatID": 2,
            "Val": 62
        },
        {
            "Max": 100,
            "StaffID": 394,
            "StatID": 3,
            "Val": 58
        },
        {
            "Max": 100,
            "StaffID": 394,
            "StatID": 4,
            "Val": 59
        },
        {
            "Max": 100,
            "StaffID": 394,
            "StatID": 5,
            "Val": 54
        },
        {
            "Max": 100,
            "StaffID": 394,
            "StatID": 6,
            "Val": 61
        },
        {
            "Max": 100,
            "StaffID": 394,
            "StatID": 7,
            "Val": 64
        },
        {
            "Max": 100,
            "StaffID": 394,
            "StatID": 8,
            "Val": 60
        },
        {
            "Max": 100,
            "StaffID": 394,
            "StatID": 9,
            "Val": 58
        },
        {
            "Max": 100,
            "StaffID": 394,
            "StatID": 10,
            "Val": 64
        },
        {
            "Max": 100,
            "StaffID": 398,
            "StatID": 2,
            "Val": 69
        },
        {
            "Max": 100,
            "StaffID": 398,
            "StatID": 3,
            "Val": 78
        },
        {
            "Max": 100,
            "StaffID": 398,
            "StatID": 4,
            "Val": 75
        },
        {
            "Max": 100,
            "StaffID": 398,
            "StatID": 5,
            "Val": 74
        },
        {
            "Max": 100,
            "StaffID": 398,
            "StatID": 6,
            "Val": 80
        },
        {
            "Max": 100,
            "StaffID": 398,
            "StatID": 7,
            "Val": 80
        },
        {
            "Max": 100,
            "StaffID": 398,
            "StatID": 8,
            "Val": 71
        },
        {
            "Max": 100,
            "StaffID": 398,
            "StatID": 9,
            "Val": 77
        },
        {
            "Max": 100,
            "StaffID": 398,
            "StatID": 10,
            "Val": 74
        },
        {
            "Max": 100,
            "StaffID": 399,
            "StatID": 2,
            "Val": 70
        },
        {
            "Max": 100,
            "StaffID": 399,
            "StatID": 3,
            "Val": 60
        },
        {
            "Max": 100,
            "StaffID": 399,
            "StatID": 4,
            "Val": 72
        },
        {
            "Max": 100,
            "StaffID": 399,
            "StatID": 5,
            "Val": 55
        },
        {
            "Max": 100,
            "StaffID": 399,
            "StatID": 6,
            "Val": 62
        },
        {
            "Max": 100,
            "StaffID": 399,
            "StatID": 7,
            "Val": 74
        },
        {
            "Max": 100,
            "StaffID": 399,
            "StatID": 8,
            "Val": 74
        },
        {
            "Max": 100,
            "StaffID": 399,
            "StatID": 9,
            "Val": 60
        },
        {
            "Max": 100,
            "StaffID": 399,
            "StatID": 10,
            "Val": 69
        },
        {
            "Max": 100,
            "StaffID": 411,
            "StatID": 2,
            "Val": 67
        },
        {
            "Max": 100,
            "StaffID": 411,
            "StatID": 3,
            "Val": 68
        },
        {
            "Max": 100,
            "StaffID": 411,
            "StatID": 4,
            "Val": 66
        },
        {
            "Max": 100,
            "StaffID": 411,
            "StatID": 5,
            "Val": 69
        },
        {
            "Max": 100,
            "StaffID": 411,
            "StatID": 6,
            "Val": 64
        },
        {
            "Max": 100,
            "StaffID": 411,
            "StatID": 7,
            "Val": 74
        },
        {
            "Max": 100,
            "StaffID": 411,
            "StatID": 8,
            "Val": 66
        },
        {
            "Max": 100,
            "StaffID": 411,
            "StatID": 9,
            "Val": 69
        },
        {
            "Max": 100,
            "StaffID": 411,
            "StatID": 10,
            "Val": 58
        },
        {
            "Max": 100,
            "StaffID": 413,
            "StatID": 2,
            "Val": 75
        },
        {
            "Max": 100,
            "StaffID": 413,
            "StatID": 3,
            "Val": 78
        },
        {
            "Max": 100,
            "StaffID": 413,
            "StatID": 4,
            "Val": 71
        },
        {
            "Max": 100,
            "StaffID": 413,
            "StatID": 5,
            "Val": 72
        },
        {
            "Max": 100,
            "StaffID": 413,
            "StatID": 6,
            "Val": 76
        },
        {
            "Max": 100,
            "StaffID": 413,
            "StatID": 7,
            "Val": 76
        },
        {
            "Max": 100,
            "StaffID": 413,
            "StatID": 8,
            "Val": 75
        },
        {
            "Max": 100,
            "StaffID": 413,
            "StatID": 9,
            "Val": 79
        },
        {
            "Max": 100,
            "StaffID": 413,
            "StatID": 10,
            "Val": 78
        }
    ],
    "Calendar": [
        {
            "TrackID": 1,
            "Day": 45732,
            "WeekendType": 0
        },
        {
            "TrackID": 3,
            "Day": 45739,
            "WeekendType": 1
        },
        {
            "TrackID": 17,
            "Day": 45753,
            "WeekendType": 0
        },
        {
            "TrackID": 2,
            "Day": 45760,
            "WeekendType": 0
        },
        {
            "TrackID": 11,
            "Day": 45767,
            "WeekendType": 0
        },
        {
            "TrackID": 22,
            "Day": 45781,
            "WeekendType": 1
        },
        {
            "TrackID": 24,
            "Day": 45795,
            "WeekendType": 0
        },
        {
            "TrackID": 6,
            "Day": 45802,
            "WeekendType": 0
        },
        {
            "TrackID": 5,
            "Day": 45809,
            "WeekendType": 0
        },
        {
            "TrackID": 7,
            "Day": 45823,
            "WeekendType": 0
        },
        {
            "TrackID": 9,
            "Day": 45837,
            "WeekendType": 0
        },
        {
            "TrackID": 10,
            "Day": 45844,
            "WeekendType": 0
        },
        {
            "TrackID": 13,
            "Day": 45865,
            "WeekendType": 1
        },
        {
            "TrackID": 12,
            "Day": 45872,
            "WeekendType": 0
        },
        {
            "TrackID": 23,
            "Day": 45900,
            "WeekendType": 0
        },
        {
            "TrackID": 14,
            "Day": 45907,
            "WeekendType": 0
        },
        {
            "TrackID": 4,
            "Day": 45921,
            "WeekendType": 0
        },
        {
            "TrackID": 15,
            "Day": 45935,
            "WeekendType": 0
        },
        {
            "TrackID": 19,
            "Day": 45949,
            "WeekendType": 1
        },
        {
            "TrackID": 18,
            "Day": 45956,
            "WeekendType": 0
        },
        {
            "TrackID": 20,
            "Day": 45970,
            "WeekendType": 1
        },
        {
            "TrackID": 25,
            "Day": 45983,
            "WeekendType": 0
        },
        {
            "TrackID": 26,
            "Day": 45991,
            "WeekendType": 1
        },
        {
            "TrackID": 21,
            "Day": 45998,
            "WeekendType": 0
        }
    ],
    "DriverStandings": [
        {
            "DriverID": 1,
            "LastPointsChange": 0,
            "LastPositionChange": 0,
            "Points": 223,
            "Position": 7,
            "RaceFormula": 1,
            "SeasonID": 2024
        },
        {
            "DriverID": 2,
            "LastPointsChange": 0,
            "LastPositionChange": 0,
            "Points": 356,
            "Position": 3,
            "RaceFormula": 1,
            "SeasonID": 2024
        },
        {
            "DriverID": 3,
            "LastPointsChange": 0,
            "LastPositionChange": 0,
            "Points": 12,
            "Position": 16,
            "RaceFormula": 1,
            "SeasonID": 2024
        },
        {
            "DriverID": 8,
            "LastPointsChange": 0,
            "LastPositionChange": 0,
            "Points": 0,
            "Position": 19,
            "RaceFormula": 1,
            "SeasonID": 2024
        },
        {
            "DriverID": 10,
            "LastPointsChange": 0,
            "LastPositionChange": 0,
            "Points": 437,
            "Position": 1,
            "RaceFormula": 1,
            "SeasonID": 2024
        },
        {
            "DriverID": 11,
            "LastPointsChange": 0,
            "LastPositionChange": 0,
            "Points": 290,
            "Position": 5,
            "RaceFormula": 1,
            "SeasonID": 2024
        },
        {
            "DriverID": 12,
            "LastPointsChange": 0,
            "LastPositionChange": 0,
            "Points": 374,
            "Position": 2,
            "RaceFormula": 1,
            "SeasonID": 2024
        },
        {
            "DriverID": 13,
            "LastPointsChange": 0,
            "LastPositionChange": 0,
            "Points": 12,
            "Position": 17,
            "RaceFormula": 1,
            "SeasonID": 2024
        },
        {
            "DriverID": 14,
            "LastPointsChange": 0,
            "LastPositionChange": 0,
            "Points": 23,
            "Position": 14,
            "RaceFormula": 1,
            "SeasonID": 2024
        },
        {
            "DriverID": 15,
            "LastPointsChange": 0,
            "LastPositionChange": 0,
            "Points": 42,
            "Position": 10,
            "RaceFormula": 1,
            "SeasonID": 2024
        },
        {
            "DriverID": 17,
            "LastPointsChange": 0,
            "LastPositionChange": 0,
            "Points": 152,
            "Position": 8,
            "RaceFormula": 1,
            "SeasonID": 2024
        },
        {
            "DriverID": 18,
            "LastPointsChange": 0,
            "LastPositionChange": 0,
            "Points": 24,
            "Position": 13,
            "RaceFormula": 1,
            "SeasonID": 2024
        },
        {
            "DriverID": 23,
            "LastPointsChange": 0,
            "LastPositionChange": 0,
            "Points": 245,
            "Position": 6,
            "RaceFormula": 1,
            "SeasonID": 2024
        },
        {
            "DriverID": 77,
            "LastPointsChange": 0,
            "LastPositionChange": 0,
            "Points": 70,
            "Position": 9,
            "RaceFormula": 1,
            "SeasonID": 2024
        },
        {
            "DriverID": 81,
            "LastPointsChange": 0,
            "LastPositionChange": 0,
            "Points": 30,
            "Position": 12,
            "RaceFormula": 1,
            "SeasonID": 2024
        },
        {
            "DriverID": 83,
            "LastPointsChange": 0,
            "LastPositionChange": 0,
            "Points": 41,
            "Position": 11,
            "RaceFormula": 1,
            "SeasonID": 2024
        },
        {
            "DriverID": 102,
            "LastPointsChange": 0,
            "LastPositionChange": 0,
            "Points": 292,
            "Position": 4,
            "RaceFormula": 1,
            "SeasonID": 2024
        },
        {
            "DriverID": 105,
            "LastPointsChange": 0,
            "LastPositionChange": 0,
            "Points": 4,
            "Position": 18,
            "RaceFormula": 1,
            "SeasonID": 2024
        },
        {
            "DriverID": 116,
            "LastPointsChange": 0,
            "LastPositionChange": 0,
            "Points": 0,
            "Position": 20,
            "RaceFormula": 1,
            "SeasonID": 2024
        },
        {
            "DriverID": 255,
            "LastPointsChange": 0,
            "LastPositionChange": 0,
            "Points": 16,
            "Position": 15,
            "RaceFormula": 1,
            "SeasonID": 2024
        }
    ],
    "TeamStandings": [
        {
            "LastPointsChange": 0,
            "LastPositionChange": 0,
            "Points": 652,
            "Position": 2,
            "RaceFormula": 1,
            "SeasonID": 2024,
            "TeamID": 1
        },
        {
            "LastPointsChange": 0,
            "LastPositionChange": 0,
            "Points": 666,
            "Position": 1,
            "RaceFormula": 1,
            "SeasonID": 2024,
            "TeamID": 2
        },
        {
            "LastPointsChange": 0,
            "LastPositionChange": 0,
            "Points": 589,
            "Position": 3,
            "RaceFormula": 1,
            "SeasonID": 2024,
            "TeamID": 3
        },
        {
            "LastPointsChange": 0,
            "LastPositionChange": 0,
            "Points": 468,
            "Position": 4,
            "RaceFormula": 1,
            "SeasonID": 2024,
            "TeamID": 4
        },
        {
            "LastPointsChange": 0,
            "LastPositionChange": 0,
            "Points": 65,
            "Position": 6,
            "RaceFormula": 1,
            "SeasonID": 2024,
            "TeamID": 5
        },
        {
            "LastPointsChange": 0,
            "LastPositionChange": 0,
            "Points": 17,
            "Position": 9,
            "RaceFormula": 1,
            "SeasonID": 2024,
            "TeamID": 6
        },
        {
            "LastPointsChange": 0,
            "LastPositionChange": 0,
            "Points": 58,
            "Position": 7,
            "RaceFormula": 1,
            "SeasonID": 2024,
            "TeamID": 7
        },
        {
            "LastPointsChange": 0,
            "LastPositionChange": 0,
            "Points": 46,
            "Position": 8,
            "RaceFormula": 1,
            "SeasonID": 2024,
            "TeamID": 8
        },
        {
            "LastPointsChange": 0,
            "LastPositionChange": 0,
            "Points": 4,
            "Position": 10,
            "RaceFormula": 1,
            "SeasonID": 2024,
            "TeamID": 9
        },
        {
            "LastPointsChange": 0,
            "LastPositionChange": 0,
            "Points": 94,
            "Position": 5,
            "RaceFormula": 1,
            "SeasonID": 2024,
            "TeamID": 10
        }
    ],
    "Staff_BasicData": [
        {
            "StaffID": 600,
            "FirstName": "[STRING_LITERAL:Value=|Ella|]",
            "LastName": "[STRING_LITERAL:Value=|Lloyd|]",
            "CountryID": 186,
            "DOB": 38553,
            "DOB_ISO": "2005-07-20",
            "Gender": 1,
            "IsGeneratedStaff": 1,
            "PhotoDay": 45340,
            "FaceType": 0,
            "FaceIndex": 0,
            "AgeType": 0,
            "IsGeneratedForCustomTeam": 0
        },
        {
            "StaffID": 601,
            "FirstName": "[STRING_LITERAL:Value=|John|]",
            "LastName": "[STRING_LITERAL:Value=|Bennett|]",
            "CountryID": 186,
            "DOB": 37879,
            "DOB_ISO": "2003-09-15",
            "Gender": 0,
            "IsGeneratedStaff": 1,
            "PhotoDay": 45340,
            "FaceType": 0,
            "FaceIndex": 0,
            "AgeType": 0,
            "IsGeneratedForCustomTeam": 0
        },
        {
            "StaffID": 602,
            "FirstName": "[STRING_LITERAL:Value=|Brando|]",
            "LastName": "[STRING_LITERAL:Value=|Badoer|]",
            "CountryID": 79,
            "DOB": 38975,
            "DOB_ISO": "2006-09-15",
            "Gender": 0,
            "IsGeneratedStaff": 1,
            "PhotoDay": 45340,
            "FaceType": 0,
            "FaceIndex": 1,
            "AgeType": 0,
            "IsGeneratedForCustomTeam": 0
        },
        {
            "StaffID": 603,
            "FirstName": "[STRING_LITERAL:Value=|Antonio|]",
            "LastName": "[STRING_LITERAL:Value=|Fuoco|]",
            "CountryID": 79,
            "DOB": 35205,
            "DOB_ISO": "1996-05-20",
            "Gender": 0,
            "IsGeneratedStaff": 1,
            "PhotoDay": 45340,
            "FaceType": 0,
            "FaceIndex": 2,
            "AgeType": 0,
            "IsGeneratedForCustomTeam": 0
        },
        {
            "StaffID": 604,
            "FirstName": "[STRING_LITERAL:Value=|Rafael|]",
            "LastName": "[STRING_LITERAL:Value=|Câmara|]",
            "CountryID": 23,
            "DOB": 38477,
            "DOB_ISO": "2005-05-05",
            "Gender": 0,
            "IsGeneratedStaff": 1,
            "PhotoDay": 45340,
            "FaceType": 0,
            "FaceIndex": 3,
            "AgeType": 0,
            "IsGeneratedForCustomTeam": 0
        },
        {
            "StaffID": 605,
            "FirstName": "[STRING_LITERAL:Value=|Doriane|]",
            "LastName": "[STRING_LITERAL:Value=|Pin|]",
            "CountryID": 57,
            "DOB": 37992,
            "DOB_ISO": "2004-01-06",
            "Gender": 1,
            "IsGeneratedStaff": 1,
            "PhotoDay": 45340,
            "FaceType": 0,
            "FaceIndex": 1,
            "AgeType": 0,
            "IsGeneratedForCustomTeam": 0
        },
        {
            "StaffID": 606,
            "FirstName": "[STRING_LITERAL:Value=|Nina|]",
            "LastName": "[STRING_LITERAL:Value=|Gademan|]",
            "CountryID": 120,
            "DOB": 37894,
            "DOB_ISO": "2003-09-30",
            "Gender": 1,
            "IsGeneratedStaff": 1,
            "PhotoDay": 45340,
            "FaceType": 0,
            "FaceIndex": 2,
            "AgeType": 0,
            "IsGeneratedForCustomTeam": 0
        },
        {
            "StaffID": 607,
            "FirstName": "[STRING_LITERAL:Value=|Courtney|]",
            "LastName": "[STRING_LITERAL:Value=|Crone|]",
            "CountryID": 187,
            "DOB": 36957,
            "DOB_ISO": "2001-03-07",
            "Gender": 1,
            "IsGeneratedStaff": 1,
            "PhotoDay": 45340,
            "FaceType": 0,
            "FaceIndex": 3,
            "AgeType": 0,
            "IsGeneratedForCustomTeam": 0
        },
        {
            "StaffID": 608,
            "FirstName": "[STRING_LITERAL:Value=|Jamie|]",
            "LastName": "[STRING_LITERAL:Value=|Chadwick|]",
            "CountryID": 186,
            "DOB": 35935,
            "DOB_ISO": "1998-05-20",
            "Gender": 1,
            "IsGeneratedStaff": 1,
            "PhotoDay": 45340,
            "FaceType": 0,
            "FaceIndex": 4,
            "AgeType": 0,
            "IsGeneratedForCustomTeam": 0
        },
        {
            "StaffID": 609,
            "FirstName": "[STRING_LITERAL:Value=|Lia|]",
            "LastName": "[STRING_LITERAL:Value=|Block|]",
            "CountryID": 187,
            "DOB": 38991,
            "DOB_ISO": "2006-10-01",
            "Gender": 1,
            "IsGeneratedStaff": 1,
            "PhotoDay": 45340,
            "FaceType": 0,
            "FaceIndex": 5,
            "AgeType": 0,
            "IsGeneratedForCustomTeam": 0
        },
        {
            "StaffID": 610,
            "FirstName": "[STRING_LITERAL:Value=|Noah|]",
            "LastName": "[STRING_LITERAL:Value=|Strømsted|]",
            "CountryID": 43,
            "DOB": 39292,
            "DOB_ISO": "2007-07-29",
            "Gender": 0,
            "IsGeneratedStaff": 1,
            "PhotoDay": 45340,
            "FaceType": 0,
            "FaceIndex": 4,
            "AgeType": 0,
            "IsGeneratedForCustomTeam": 0
        },
        {
            "StaffID": 611,
            "FirstName": "[STRING_LITERAL:Value=|James|]",
            "LastName": "[STRING_LITERAL:Value=|Wharton|]",
            "CountryID": 9,
            "DOB": 38906,
            "DOB_ISO": "2006-07-08",
            "Gender": 0,
            "IsGeneratedStaff": 1,
            "PhotoDay": 45340,
            "FaceType": 0,
            "FaceIndex": 5,
            "AgeType": 0,
            "IsGeneratedForCustomTeam": 0
        },
        {
            "StaffID": 612,
            "FirstName": "[STRING_LITERAL:Value=|Gerrard|]",
            "LastName": "[STRING_LITERAL:Value=|Xie|]",
            "CountryID": 35,
            "DOB": 38984,
            "DOB_ISO": "2006-09-24",
            "Gender": 0,
            "IsGeneratedStaff": 1,
            "PhotoDay": 45340,
            "FaceType": 4,
            "FaceIndex": 0,
            "AgeType": 0,
            "IsGeneratedForCustomTeam": 0
        },
        {
            "StaffID": 613,
            "FirstName": "[STRING_LITERAL:Value=|Bruno|]",
            "LastName": "[STRING_LITERAL:Value=|del Pino|]",
            "CountryID": 160,
            "DOB": 38888,
            "DOB_ISO": "2006-06-20",
            "Gender": 0,
            "IsGeneratedStaff": 1,
            "PhotoDay": 45340,
            "FaceType": 0,
            "FaceIndex": 6,
            "AgeType": 0,
            "IsGeneratedForCustomTeam": 0
        },
        {
            "StaffID": 614,
            "FirstName": "[STRING_LITERAL:Value=|Alessandro|]",
            "LastName": "[STRING_LITERAL:Value=|Giusti|]",
            "CountryID": 57,
            "DOB": 38970,
            "DOB_ISO": "2006-09-10",
            "Gender": 0,
            "IsGeneratedStaff": 1,
            "PhotoDay": 45340,
            "FaceType": 0,
            "FaceIndex": 7,
            "AgeType": 0,
            "IsGeneratedForCustomTeam": 0
        },
        {
            "StaffID": 615,
            "FirstName": "[STRING_LITERAL:Value=|Théophile|]",
            "LastName": "[STRING_LITERAL:Value=|Naël|]",
            "CountryID": 57,
            "DOB": 39255,
            "DOB_ISO": "2007-06-22",
            "Gender": 0,
            "IsGeneratedStaff": 1,
            "PhotoDay": 45340,
            "FaceType": 0,
            "FaceIndex": 8,
            "AgeType": 0,
            "IsGeneratedForCustomTeam": 0
        },
        {
            "StaffID": 616,
            "FirstName": "[STRING_LITERAL:Value=|Ivan|]",
            "LastName": "[STRING_LITERAL:Value=|Domingues|]",
            "CountryID": 136,
            "DOB": 38842,
            "DOB_ISO": "2006-05-05",
            "Gender": 0,
            "IsGeneratedStaff": 1,
            "PhotoDay": 45340,
            "FaceType": 0,
            "FaceIndex": 9,
            "AgeType": 0,
            "IsGeneratedForCustomTeam": 0
        },
        {
            "StaffID": 617,
            "FirstName": "[STRING_LITERAL:Value=|Louis|]",
            "LastName": "[STRING_LITERAL:Value=|Sharp|]",
            "CountryID": 121,
            "DOB": 39213,
            "DOB_ISO": "2007-05-11",
            "Gender": 0,
            "IsGeneratedStaff": 1,
            "PhotoDay": 45340,
            "FaceType": 0,
            "FaceIndex": 10,
            "AgeType": 0,
            "IsGeneratedForCustomTeam": 0
        },
        {
            "StaffID": 618,
            "FirstName": "[STRING_LITERAL:Value=|Roman|]",
            "LastName": "[STRING_LITERAL:Value=|Bilinski|]",
            "CountryID": 135,
            "DOB": 38050,
            "DOB_ISO": "2004-03-04",
            "Gender": 0,
            "IsGeneratedStaff": 1,
            "PhotoDay": 45340,
            "FaceType": 0,
            "FaceIndex": 11,
            "AgeType": 0,
            "IsGeneratedForCustomTeam": 0
        },
        {
            "StaffID": 619,
            "FirstName": "[STRING_LITERAL:Value=|Javier|]",
            "LastName": "[STRING_LITERAL:Value=|Sagrera|]",
            "CountryID": 160,
            "DOB": 37998,
            "DOB_ISO": "2004-01-12",
            "Gender": 0,
            "IsGeneratedStaff": 1,
            "PhotoDay": 45340,
            "FaceType": 0,
            "FaceIndex": 12,
            "AgeType": 0,
            "IsGeneratedForCustomTeam": 0
        },
        {
            "StaffID": 620,
            "FirstName": "[STRING_LITERAL:Value=|Nicola|]",
            "LastName": "[STRING_LITERAL:Value=|Marinangeli|]",
            "CountryID": 79,
            "DOB": 37755,
            "DOB_ISO": "2003-05-14",
            "Gender": 0,
            "IsGeneratedStaff": 1,
            "PhotoDay": 45340,
            "FaceType": 0,
            "FaceIndex": 13,
            "AgeType": 0,
            "IsGeneratedForCustomTeam": 0
        },
        {
            "StaffID": 621,
            "FirstName": "[STRING_LITERAL:Value=|Christian|]",
            "LastName": "[STRING_LITERAL:Value=|Ho|]",
            "CountryID": 152,
            "DOB": 39021,
            "DOB_ISO": "2006-10-31",
            "Gender": 0,
            "IsGeneratedStaff": 1,
            "PhotoDay": 45340,
            "FaceType": 4,
            "FaceIndex": 1,
            "AgeType": 0,
            "IsGeneratedForCustomTeam": 0
        },
        {
            "StaffID": 622,
            "FirstName": "[STRING_LITERAL:Value=|Bryan|]",
            "LastName": "[STRING_LITERAL:Value=|Bozzi|]",
            "CountryID": 79,
            "DOB": 29221,
            "DOB_ISO": "1980-01-01",
            "Gender": 0,
            "IsGeneratedStaff": 1,
            "PhotoDay": 45340,
            "FaceType": 0,
            "FaceIndex": 0,
            "AgeType": 1,
            "IsGeneratedForCustomTeam": 0
        },
        {
            "StaffID": 623,
            "FirstName": "[STRING_LITERAL:Value=|Richard|]",
            "LastName": "[STRING_LITERAL:Value=|Wood|]",
            "CountryID": 186,
            "DOB": 29221,
            "DOB_ISO": "1980-01-01",
            "Gender": 0,
            "IsGeneratedStaff": 1,
            "PhotoDay": 45340,
            "FaceType": 0,
            "FaceIndex": 11,
            "AgeType": 1,
            "IsGeneratedForCustomTeam": 0
        },
        {
            "StaffID": 624,
            "FirstName": "[STRING_LITERAL:Value=|Laura|]",
            "LastName": "[STRING_LITERAL:Value=|Mueller|]",
            "CountryID": 60,
            "DOB": 32874,
            "DOB_ISO": "1990-01-01",
            "Gender": 1,
            "IsGeneratedStaff": 1,
            "PhotoDay": 45340,
            "FaceType": 0,
            "FaceIndex": 0,
            "AgeType": 1,
            "IsGeneratedForCustomTeam": 0
        },
        {
            "StaffID": 625,
            "FirstName": "[STRING_LITERAL:Value=|Ronan|]",
            "LastName": "[STRING_LITERAL:Value=|O'Hare|]",
            "CountryID": 186,
            "DOB": 29221,
            "DOB_ISO": "1980-01-01",
            "Gender": 0,
            "IsGeneratedStaff": 1,
            "PhotoDay": 45340,
            "FaceType": 0,
            "FaceIndex": 11,
            "AgeType": 1,
            "IsGeneratedForCustomTeam": 0
        },
        {
            "StaffID": 626,
            "FirstName": "[STRING_LITERAL:Value=|Ernesto|]",
            "LastName": "[STRING_LITERAL:Value=|Desiderio|]",
            "CountryID": 79,
            "DOB": 29221,
            "DOB_ISO": "1980-01-01",
            "Gender": 0,
            "IsGeneratedStaff": 1,
            "PhotoDay": 45340,
            "FaceType": 0,
            "FaceIndex": 1,
            "AgeType": 1,
            "IsGeneratedForCustomTeam": 0
        },
        {
            "StaffID": 628,
            "FirstName": "[STRING_LITERAL:Value=|Rob|]",
            "LastName": "[STRING_LITERAL:Value=|Marshall|]",
            "CountryID": 186,
            "DOB": 24942,
            "DOB_ISO": "1968-04-14",
            "Gender": 0,
            "IsGeneratedStaff": 1,
            "PhotoDay": 45340,
            "FaceType": 0,
            "FaceIndex": 2,
            "AgeType": 1,
            "IsGeneratedForCustomTeam": 0
        },
        {
            "StaffID": 630,
            "FirstName": "[STRING_LITERAL:Value=|David|]",
            "LastName": "[STRING_LITERAL:Value=|Sanchez|]",
            "CountryID": 57,
            "DOB": 29221,
            "DOB_ISO": "1980-01-01",
            "Gender": 0,
            "IsGeneratedStaff": 1,
            "PhotoDay": 45340,
            "FaceType": 0,
            "FaceIndex": 3,
            "AgeType": 1,
            "IsGeneratedForCustomTeam": 0
        },
        {
            "StaffID": 633,
            "FirstName": "[STRING_LITERAL:Value=|Selin|]",
            "LastName": "[STRING_LITERAL:Value=|Tur|]",
            "CountryID": 186,
            "DOB": 28518,
            "DOB_ISO": "1978-01-28",
            "Gender": 0,
            "IsGeneratedStaff": 1,
            "PhotoDay": 45340,
            "FaceType": 0,
            "FaceIndex": 1,
            "AgeType": 1,
            "IsGeneratedForCustomTeam": 0
        },
        {
            "StaffID": 635,
            "FirstName": "[STRING_LITERAL:Value=|Sean|]",
            "LastName": "[STRING_LITERAL:Value=|Whitehead|]",
            "CountryID": 186,
            "DOB": 23025,
            "DOB_ISO": "1963-01-14",
            "Gender": 0,
            "IsGeneratedStaff": 1,
            "PhotoDay": 45340,
            "FaceType": 0,
            "FaceIndex": 11,
            "AgeType": 1,
            "IsGeneratedForCustomTeam": 0
        },
        {
            "StaffID": 636,
            "FirstName": "[STRING_LITERAL:Value=|Mark|]",
            "LastName": "[STRING_LITERAL:Value=|Robinson|]",
            "CountryID": 186,
            "DOB": 29221,
            "DOB_ISO": "1980-01-01",
            "Gender": 0,
            "IsGeneratedStaff": 1,
            "PhotoDay": 45340,
            "FaceType": 0,
            "FaceIndex": 11,
            "AgeType": 1,
            "IsGeneratedForCustomTeam": 0
        },
        {
            "StaffID": 637,
            "FirstName": "[STRING_LITERAL:Value=|Peter|]",
            "LastName": "[STRING_LITERAL:Value=|Machin|]",
            "CountryID": 186,
            "DOB": 24838,
            "DOB_ISO": "1968-01-01",
            "Gender": 0,
            "IsGeneratedStaff": 1,
            "PhotoDay": 45340,
            "FaceType": 0,
            "FaceIndex": 11,
            "AgeType": 1,
            "IsGeneratedForCustomTeam": 0
        },
        {
            "StaffID": 638,
            "FirstName": "[STRING_LITERAL:Value=|Will|]",
            "LastName": "[STRING_LITERAL:Value=|Courtenay|]",
            "CountryID": 186,
            "DOB": 29221,
            "DOB_ISO": "1980-01-01",
            "Gender": 0,
            "IsGeneratedStaff": 1,
            "PhotoDay": 45340,
            "FaceType": 0,
            "FaceIndex": 4,
            "AgeType": 1,
            "IsGeneratedForCustomTeam": 0
        },
        {
            "StaffID": 639,
            "FirstName": "[STRING_LITERAL:Value=|Richard|]",
            "LastName": "[STRING_LITERAL:Value=|Wolverson|]",
            "CountryID": 186,
            "DOB": 29221,
            "DOB_ISO": "1980-01-01",
            "Gender": 0,
            "IsGeneratedStaff": 1,
            "PhotoDay": 45340,
            "FaceType": 0,
            "FaceIndex": 5,
            "AgeType": 1,
            "IsGeneratedForCustomTeam": 0
        },
        {
            "StaffID": 640,
            "FirstName": "[STRING_LITERAL:Value=|Mark|]",
            "LastName": "[STRING_LITERAL:Value=|Lowe|]",
            "CountryID": 187,
            "DOB": 29221,
            "DOB_ISO": "1980-01-01",
            "Gender": 0,
            "IsGeneratedStaff": 1,
            "PhotoDay": 45340,
            "FaceType": 0,
            "FaceIndex": 6,
            "AgeType": 1,
            "IsGeneratedForCustomTeam": 0
        },
        {
            "StaffID": 641,
            "FirstName": "[STRING_LITERAL:Value=|Ignacio|]",
            "LastName": "[STRING_LITERAL:Value=|Rueda|]",
            "CountryID": 160,
            "DOB": 28708,
            "DOB_ISO": "1978-08-06",
            "Gender": 0,
            "IsGeneratedStaff": 1,
            "PhotoDay": 45340,
            "FaceType": 0,
            "FaceIndex": 7,
            "AgeType": 1,
            "IsGeneratedForCustomTeam": 0
        },
        {
            "StaffID": 642,
            "FirstName": "[STRING_LITERAL:Value=|Loïc|]",
            "LastName": "[STRING_LITERAL:Value=|Serra|]",
            "CountryID": 57,
            "DOB": 26388,
            "DOB_ISO": "1972-03-30",
            "Gender": 0,
            "IsGeneratedStaff": 1,
            "PhotoDay": 45340,
            "FaceType": 0,
            "FaceIndex": 8,
            "AgeType": 1,
            "IsGeneratedForCustomTeam": 0
        },
        {
            "StaffID": 643,
            "FirstName": "[STRING_LITERAL:Value=|Steven|]",
            "LastName": "[STRING_LITERAL:Value=|Petrik|]",
            "CountryID": 187,
            "DOB": 29221,
            "DOB_ISO": "1980-01-01",
            "Gender": 0,
            "IsGeneratedStaff": 1,
            "PhotoDay": 45340,
            "FaceType": 0,
            "FaceIndex": 9,
            "AgeType": 1,
            "IsGeneratedForCustomTeam": 0
        },
        {
            "StaffID": 644,
            "FirstName": "[STRING_LITERAL:Value=|Jose Manuel|]",
            "LastName": "[STRING_LITERAL:Value=|Lopez|]",
            "CountryID": 160,
            "DOB": 29221,
            "DOB_ISO": "1980-01-01",
            "Gender": 0,
            "IsGeneratedStaff": 1,
            "PhotoDay": 45340,
            "FaceType": 0,
            "FaceIndex": 10,
            "AgeType": 1,
            "IsGeneratedForCustomTeam": 0
        }
    ],
    "Staff_PerformanceStats": [
        {
            "StaffID": 600,
            "StatID": 2,
            "Val": 57,
            "Max": 100
        },
        {
            "StaffID": 600,
            "StatID": 3,
            "Val": 57,
            "Max": 100
        },
        {
            "StaffID": 600,
            "StatID": 4,
            "Val": 57,
            "Max": 100
        },
        {
            "StaffID": 600,
            "StatID": 5,
            "Val": 57,
            "Max": 100
        },
        {
            "StaffID": 600,
            "StatID": 6,
            "Val": 57,
            "Max": 100
        },
        {
            "StaffID": 600,
            "StatID": 7,
            "Val": 57,
            "Max": 100
        },
        {
            "StaffID": 600,
            "StatID": 8,
            "Val": 57,
            "Max": 100
        },
        {
            "StaffID": 600,
            "StatID": 9,
            "Val": 57,
            "Max": 100
        },
        {
            "StaffID": 600,
            "StatID": 10,
            "Val": 57,
            "Max": 100
        },
        {
            "StaffID": 601,
            "StatID": 2,
            "Val": 60,
            "Max": 100
        },
        {
            "StaffID": 601,
            "StatID": 3,
            "Val": 60,
            "Max": 100
        },
        {
            "StaffID": 601,
            "StatID": 4,
            "Val": 60,
            "Max": 100
        },
        {
            "StaffID": 601,
            "StatID": 5,
            "Val": 60,
            "Max": 100
        },
        {
            "StaffID": 601,
            "StatID": 6,
            "Val": 60,
            "Max": 100
        },
        {
            "StaffID": 601,
            "StatID": 7,
            "Val": 60,
            "Max": 100
        },
        {
            "StaffID": 601,
            "StatID": 8,
            "Val": 60,
            "Max": 100
        },
        {
            "StaffID": 601,
            "StatID": 9,
            "Val": 60,
            "Max": 100
        },
        {
            "StaffID": 601,
            "StatID": 10,
            "Val": 60,
            "Max": 100
        },
        {
            "StaffID": 602,
            "StatID": 2,
            "Val": 64,
            "Max": 100
        },
        {
            "StaffID": 602,
            "StatID": 3,
            "Val": 64,
            "Max": 100
        },
        {
            "StaffID": 602,
            "StatID": 4,
            "Val": 64,
            "Max": 100
        },
        {
            "StaffID": 602,
            "StatID": 5,
            "Val": 64,
            "Max": 100
        },
        {
            "StaffID": 602,
            "StatID": 6,
            "Val": 64,
            "Max": 100
        },
        {
            "StaffID": 602,
            "StatID": 7,
            "Val": 64,
            "Max": 100
        },
        {
            "StaffID": 602,
            "StatID": 8,
            "Val": 64,
            "Max": 100
        },
        {
            "StaffID": 602,
            "StatID": 9,
            "Val": 64,
            "Max": 100
        },
        {
            "StaffID": 602,
            "StatID": 10,
            "Val": 64,
            "Max": 100
        },
        {
            "StaffID": 603,
            "StatID": 2,
            "Val": 75,
            "Max": 100
        },
        {
            "StaffID": 603,
            "StatID": 3,
            "Val": 75,
            "Max": 100
        },
        {
            "StaffID": 603,
            "StatID": 4,
            "Val": 75,
            "Max": 100
        },
        {
            "StaffID": 603,
            "StatID": 5,
            "Val": 75,
            "Max": 100
        },
        {
            "StaffID": 603,
            "StatID": 6,
            "Val": 75,
            "Max": 100
        },
        {
            "StaffID": 603,
            "StatID": 7,
            "Val": 75,
            "Max": 100
        },
        {
            "StaffID": 603,
            "StatID": 8,
            "Val": 75,
            "Max": 100
        },
        {
            "StaffID": 603,
            "StatID": 9,
            "Val": 75,
            "Max": 100
        },
        {
            "StaffID": 603,
            "StatID": 10,
            "Val": 75,
            "Max": 100
        },
        {
            "StaffID": 604,
            "StatID": 2,
            "Val": 64,
            "Max": 100
        },
        {
            "StaffID": 604,
            "StatID": 3,
            "Val": 64,
            "Max": 100
        },
        {
            "StaffID": 604,
            "StatID": 4,
            "Val": 64,
            "Max": 100
        },
        {
            "StaffID": 604,
            "StatID": 5,
            "Val": 64,
            "Max": 100
        },
        {
            "StaffID": 604,
            "StatID": 6,
            "Val": 64,
            "Max": 100
        },
        {
            "StaffID": 604,
            "StatID": 7,
            "Val": 64,
            "Max": 100
        },
        {
            "StaffID": 604,
            "StatID": 8,
            "Val": 64,
            "Max": 100
        },
        {
            "StaffID": 604,
            "StatID": 9,
            "Val": 64,
            "Max": 100
        },
        {
            "StaffID": 604,
            "StatID": 10,
            "Val": 64,
            "Max": 100
        },
        {
            "StaffID": 605,
            "StatID": 2,
            "Val": 61,
            "Max": 100
        },
        {
            "StaffID": 605,
            "StatID": 3,
            "Val": 61,
            "Max": 100
        },
        {
            "StaffID": 605,
            "StatID": 4,
            "Val": 61,
            "Max": 100
        },
        {
            "StaffID": 605,
            "StatID": 5,
            "Val": 61,
            "Max": 100
        },
        {
            "StaffID": 605,
            "StatID": 6,
            "Val": 61,
            "Max": 100
        },
        {
            "StaffID": 605,
            "StatID": 7,
            "Val": 61,
            "Max": 100
        },
        {
            "StaffID": 605,
            "StatID": 8,
            "Val": 61,
            "Max": 100
        },
        {
            "StaffID": 605,
            "StatID": 9,
            "Val": 61,
            "Max": 100
        },
        {
            "StaffID": 605,
            "StatID": 10,
            "Val": 61,
            "Max": 100
        },
        {
            "StaffID": 606,
            "StatID": 2,
            "Val": 56,
            "Max": 100
        },
        {
            "StaffID": 606,
            "StatID": 3,
            "Val": 56,
            "Max": 100
        },
        {
            "StaffID": 606,
            "StatID": 4,
            "Val": 56,
            "Max": 100
        },
        {
            "StaffID": 606,
            "StatID": 5,
            "Val": 56,
            "Max": 100
        },
        {
            "StaffID": 606,
            "StatID": 6,
            "Val": 56,
            "Max": 100
        },
        {
            "StaffID": 606,
            "StatID": 7,
            "Val": 56,
            "Max": 100
        },
        {
            "StaffID": 606,
            "StatID": 8,
            "Val": 56,
            "Max": 100
        },
        {
            "StaffID": 606,
            "StatID": 9,
            "Val": 56,
            "Max": 100
        },
        {
            "StaffID": 606,
            "StatID": 10,
            "Val": 56,
            "Max": 100
        },
        {
            "StaffID": 607,
            "StatID": 2,
            "Val": 58,
            "Max": 100
        },
        {
            "StaffID": 607,
            "StatID": 3,
            "Val": 58,
            "Max": 100
        },
        {
            "StaffID": 607,
            "StatID": 4,
            "Val": 58,
            "Max": 100
        },
        {
            "StaffID": 607,
            "StatID": 5,
            "Val": 58,
            "Max": 100
        },
        {
            "StaffID": 607,
            "StatID": 6,
            "Val": 58,
            "Max": 100
        },
        {
            "StaffID": 607,
            "StatID": 7,
            "Val": 58,
            "Max": 100
        },
        {
            "StaffID": 607,
            "StatID": 8,
            "Val": 58,
            "Max": 100
        },
        {
            "StaffID": 607,
            "StatID": 9,
            "Val": 58,
            "Max": 100
        },
        {
            "StaffID": 607,
            "StatID": 10,
            "Val": 58,
            "Max": 100
        },
        {
            "StaffID": 608,
            "StatID": 2,
            "Val": 72,
            "Max": 100
        },
        {
            "StaffID": 608,
            "StatID": 3,
            "Val": 72,
            "Max": 100
        },
        {
            "StaffID": 608,
            "StatID": 4,
            "Val": 72,
            "Max": 100
        },
        {
            "StaffID": 608,
            "StatID": 5,
            "Val": 72,
            "Max": 100
        },
        {
            "StaffID": 608,
            "StatID": 6,
            "Val": 72,
            "Max": 100
        },
        {
            "StaffID": 608,
            "StatID": 7,
            "Val": 72,
            "Max": 100
        },
        {
            "StaffID": 608,
            "StatID": 8,
            "Val": 72,
            "Max": 100
        },
        {
            "StaffID": 608,
            "StatID": 9,
            "Val": 72,
            "Max": 100
        },
        {
            "StaffID": 608,
            "StatID": 10,
            "Val": 72,
            "Max": 100
        },
        {
            "StaffID": 609,
            "StatID": 2,
            "Val": 56,
            "Max": 100
        },
        {
            "StaffID": 609,
            "StatID": 3,
            "Val": 56,
            "Max": 100
        },
        {
            "StaffID": 609,
            "StatID": 4,
            "Val": 56,
            "Max": 100
        },
        {
            "StaffID": 609,
            "StatID": 5,
            "Val": 56,
            "Max": 100
        },
        {
            "StaffID": 609,
            "StatID": 6,
            "Val": 56,
            "Max": 100
        },
        {
            "StaffID": 609,
            "StatID": 7,
            "Val": 56,
            "Max": 100
        },
        {
            "StaffID": 609,
            "StatID": 8,
            "Val": 56,
            "Max": 100
        },
        {
            "StaffID": 609,
            "StatID": 9,
            "Val": 56,
            "Max": 100
        },
        {
            "StaffID": 609,
            "StatID": 10,
            "Val": 56,
            "Max": 100
        },
        {
            "StaffID": 610,
            "StatID": 2,
            "Val": 64,
            "Max": 100
        },
        {
            "StaffID": 610,
            "StatID": 3,
            "Val": 64,
            "Max": 100
        },
        {
            "StaffID": 610,
            "StatID": 4,
            "Val": 64,
            "Max": 100
        },
        {
            "StaffID": 610,
            "StatID": 5,
            "Val": 64,
            "Max": 100
        },
        {
            "StaffID": 610,
            "StatID": 6,
            "Val": 64,
            "Max": 100
        },
        {
            "StaffID": 610,
            "StatID": 7,
            "Val": 64,
            "Max": 100
        },
        {
            "StaffID": 610,
            "StatID": 8,
            "Val": 64,
            "Max": 100
        },
        {
            "StaffID": 610,
            "StatID": 9,
            "Val": 64,
            "Max": 100
        },
        {
            "StaffID": 610,
            "StatID": 10,
            "Val": 64,
            "Max": 100
        },
        {
            "StaffID": 611,
            "StatID": 2,
            "Val": 64,
            "Max": 100
        },
        {
            "StaffID": 611,
            "StatID": 3,
            "Val": 64,
            "Max": 100
        },
        {
            "StaffID": 611,
            "StatID": 4,
            "Val": 64,
            "Max": 100
        },
        {
            "StaffID": 611,
            "StatID": 5,
            "Val": 64,
            "Max": 100
        },
        {
            "StaffID": 611,
            "StatID": 6,
            "Val": 64,
            "Max": 100
        },
        {
            "StaffID": 611,
            "StatID": 7,
            "Val": 64,
            "Max": 100
        },
        {
            "StaffID": 611,
            "StatID": 8,
            "Val": 64,
            "Max": 100
        },
        {
            "StaffID": 611,
            "StatID": 9,
            "Val": 64,
            "Max": 100
        },
        {
            "StaffID": 611,
            "StatID": 10,
            "Val": 64,
            "Max": 100
        },
        {
            "StaffID": 612,
            "StatID": 2,
            "Val": 58,
            "Max": 100
        },
        {
            "StaffID": 612,
            "StatID": 3,
            "Val": 58,
            "Max": 100
        },
        {
            "StaffID": 612,
            "StatID": 4,
            "Val": 58,
            "Max": 100
        },
        {
            "StaffID": 612,
            "StatID": 5,
            "Val": 58,
            "Max": 100
        },
        {
            "StaffID": 612,
            "StatID": 6,
            "Val": 58,
            "Max": 100
        },
        {
            "StaffID": 612,
            "StatID": 7,
            "Val": 58,
            "Max": 100
        },
        {
            "StaffID": 612,
            "StatID": 8,
            "Val": 58,
            "Max": 100
        },
        {
            "StaffID": 612,
            "StatID": 9,
            "Val": 58,
            "Max": 100
        },
        {
            "StaffID": 612,
            "StatID": 10,
            "Val": 58,
            "Max": 100
        },
        {
            "StaffID": 613,
            "StatID": 2,
            "Val": 61,
            "Max": 100
        },
        {
            "StaffID": 613,
            "StatID": 3,
            "Val": 61,
            "Max": 100
        },
        {
            "StaffID": 613,
            "StatID": 4,
            "Val": 61,
            "Max": 100
        },
        {
            "StaffID": 613,
            "StatID": 5,
            "Val": 61,
            "Max": 100
        },
        {
            "StaffID": 613,
            "StatID": 6,
            "Val": 61,
            "Max": 100
        },
        {
            "StaffID": 613,
            "StatID": 7,
            "Val": 61,
            "Max": 100
        },
        {
            "StaffID": 613,
            "StatID": 8,
            "Val": 61,
            "Max": 100
        },
        {
            "StaffID": 613,
            "StatID": 9,
            "Val": 61,
            "Max": 100
        },
        {
            "StaffID": 613,
            "StatID": 10,
            "Val": 61,
            "Max": 100
        },
        {
            "StaffID": 614,
            "StatID": 2,
            "Val": 60,
            "Max": 100
        },
        {
            "StaffID": 614,
            "StatID": 3,
            "Val": 60,
            "Max": 100
        },
        {
            "StaffID": 614,
            "StatID": 4,
            "Val": 60,
            "Max": 100
        },
        {
            "StaffID": 614,
            "StatID": 5,
            "Val": 60,
            "Max": 100
        },
        {
            "StaffID": 614,
            "StatID": 6,
            "Val": 60,
            "Max": 100
        },
        {
            "StaffID": 614,
            "StatID": 7,
            "Val": 60,
            "Max": 100
        },
        {
            "StaffID": 614,
            "StatID": 8,
            "Val": 60,
            "Max": 100
        },
        {
            "StaffID": 614,
            "StatID": 9,
            "Val": 60,
            "Max": 100
        },
        {
            "StaffID": 614,
            "StatID": 10,
            "Val": 60,
            "Max": 100
        },
        {
            "StaffID": 615,
            "StatID": 2,
            "Val": 60,
            "Max": 100
        },
        {
            "StaffID": 615,
            "StatID": 3,
            "Val": 60,
            "Max": 100
        },
        {
            "StaffID": 615,
            "StatID": 4,
            "Val": 60,
            "Max": 100
        },
        {
            "StaffID": 615,
            "StatID": 5,
            "Val": 60,
            "Max": 100
        },
        {
            "StaffID": 615,
            "StatID": 6,
            "Val": 60,
            "Max": 100
        },
        {
            "StaffID": 615,
            "StatID": 7,
            "Val": 60,
            "Max": 100
        },
        {
            "StaffID": 615,
            "StatID": 8,
            "Val": 60,
            "Max": 100
        },
        {
            "StaffID": 615,
            "StatID": 9,
            "Val": 60,
            "Max": 100
        },
        {
            "StaffID": 615,
            "StatID": 10,
            "Val": 60,
            "Max": 100
        },
        {
            "StaffID": 616,
            "StatID": 2,
            "Val": 60,
            "Max": 100
        },
        {
            "StaffID": 616,
            "StatID": 3,
            "Val": 60,
            "Max": 100
        },
        {
            "StaffID": 616,
            "StatID": 4,
            "Val": 60,
            "Max": 100
        },
        {
            "StaffID": 616,
            "StatID": 5,
            "Val": 60,
            "Max": 100
        },
        {
            "StaffID": 616,
            "StatID": 6,
            "Val": 60,
            "Max": 100
        },
        {
            "StaffID": 616,
            "StatID": 7,
            "Val": 60,
            "Max": 100
        },
        {
            "StaffID": 616,
            "StatID": 8,
            "Val": 60,
            "Max": 100
        },
        {
            "StaffID": 616,
            "StatID": 9,
            "Val": 60,
            "Max": 100
        },
        {
            "StaffID": 616,
            "StatID": 10,
            "Val": 60,
            "Max": 100
        },
        {
            "StaffID": 617,
            "StatID": 2,
            "Val": 59,
            "Max": 100
        },
        {
            "StaffID": 617,
            "StatID": 3,
            "Val": 59,
            "Max": 100
        },
        {
            "StaffID": 617,
            "StatID": 4,
            "Val": 59,
            "Max": 100
        },
        {
            "StaffID": 617,
            "StatID": 5,
            "Val": 59,
            "Max": 100
        },
        {
            "StaffID": 617,
            "StatID": 6,
            "Val": 59,
            "Max": 100
        },
        {
            "StaffID": 617,
            "StatID": 7,
            "Val": 59,
            "Max": 100
        },
        {
            "StaffID": 617,
            "StatID": 8,
            "Val": 59,
            "Max": 100
        },
        {
            "StaffID": 617,
            "StatID": 9,
            "Val": 59,
            "Max": 100
        },
        {
            "StaffID": 617,
            "StatID": 10,
            "Val": 59,
            "Max": 100
        },
        {
            "StaffID": 618,
            "StatID": 2,
            "Val": 63,
            "Max": 100
        },
        {
            "StaffID": 618,
            "StatID": 3,
            "Val": 63,
            "Max": 100
        },
        {
            "StaffID": 618,
            "StatID": 4,
            "Val": 63,
            "Max": 100
        },
        {
            "StaffID": 618,
            "StatID": 5,
            "Val": 63,
            "Max": 100
        },
        {
            "StaffID": 618,
            "StatID": 6,
            "Val": 63,
            "Max": 100
        },
        {
            "StaffID": 618,
            "StatID": 7,
            "Val": 63,
            "Max": 100
        },
        {
            "StaffID": 618,
            "StatID": 8,
            "Val": 63,
            "Max": 100
        },
        {
            "StaffID": 618,
            "StatID": 9,
            "Val": 63,
            "Max": 100
        },
        {
            "StaffID": 618,
            "StatID": 10,
            "Val": 63,
            "Max": 100
        },
        {
            "StaffID": 619,
            "StatID": 2,
            "Val": 60,
            "Max": 100
        },
        {
            "StaffID": 619,
            "StatID": 3,
            "Val": 60,
            "Max": 100
        },
        {
            "StaffID": 619,
            "StatID": 4,
            "Val": 60,
            "Max": 100
        },
        {
            "StaffID": 619,
            "StatID": 5,
            "Val": 60,
            "Max": 100
        },
        {
            "StaffID": 619,
            "StatID": 6,
            "Val": 60,
            "Max": 100
        },
        {
            "StaffID": 619,
            "StatID": 7,
            "Val": 60,
            "Max": 100
        },
        {
            "StaffID": 619,
            "StatID": 8,
            "Val": 60,
            "Max": 100
        },
        {
            "StaffID": 619,
            "StatID": 9,
            "Val": 60,
            "Max": 100
        },
        {
            "StaffID": 619,
            "StatID": 10,
            "Val": 60,
            "Max": 100
        },
        {
            "StaffID": 620,
            "StatID": 2,
            "Val": 60,
            "Max": 100
        },
        {
            "StaffID": 620,
            "StatID": 3,
            "Val": 60,
            "Max": 100
        },
        {
            "StaffID": 620,
            "StatID": 4,
            "Val": 60,
            "Max": 100
        },
        {
            "StaffID": 620,
            "StatID": 5,
            "Val": 60,
            "Max": 100
        },
        {
            "StaffID": 620,
            "StatID": 6,
            "Val": 60,
            "Max": 100
        },
        {
            "StaffID": 620,
            "StatID": 7,
            "Val": 60,
            "Max": 100
        },
        {
            "StaffID": 620,
            "StatID": 8,
            "Val": 60,
            "Max": 100
        },
        {
            "StaffID": 620,
            "StatID": 9,
            "Val": 60,
            "Max": 100
        },
        {
            "StaffID": 620,
            "StatID": 10,
            "Val": 60,
            "Max": 100
        },
        {
            "StaffID": 621,
            "StatID": 2,
            "Val": 58,
            "Max": 100
        },
        {
            "StaffID": 621,
            "StatID": 3,
            "Val": 58,
            "Max": 100
        },
        {
            "StaffID": 621,
            "StatID": 4,
            "Val": 58,
            "Max": 100
        },
        {
            "StaffID": 621,
            "StatID": 5,
            "Val": 58,
            "Max": 100
        },
        {
            "StaffID": 621,
            "StatID": 6,
            "Val": 58,
            "Max": 100
        },
        {
            "StaffID": 621,
            "StatID": 7,
            "Val": 58,
            "Max": 100
        },
        {
            "StaffID": 621,
            "StatID": 8,
            "Val": 58,
            "Max": 100
        },
        {
            "StaffID": 621,
            "StatID": 9,
            "Val": 
Download .txt
gitextract_craxx02i/

├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   └── feature_request.md
│   └── workflows/
│       └── nightly.yml
├── .gitignore
├── LICENSE
├── README.md
├── api/
│   ├── ask-openai.js
│   ├── auth/
│   │   └── patreon/
│   │       ├── login.js
│   │       ├── logout.js
│   │       └── verify.js
│   ├── check-cookie.js
│   ├── me.js
│   └── usage-today.js
├── assets/
│   ├── custom/
│   │   └── .gitkeep
│   └── fonts/
│       ├── NewNumbers.otf
│       ├── NumbersBold.otf
│       └── NumbersRegular.otf
├── lib/
│   ├── accessControl.js
│   ├── getUserTierServer.js
│   ├── rateLimits.js
│   └── redis.js
├── package.json
├── src/
│   ├── data/
│   │   ├── 2025_changes.json
│   │   ├── 2026_changes.json
│   │   ├── contracts_2025.json
│   │   ├── members.json
│   │   ├── news/
│   │   │   ├── news_prompts_templates.json
│   │   │   ├── news_titles_templates.json
│   │   │   ├── turning_points_prompts_templates.json
│   │   │   └── turning_points_titles_templates.json
│   │   ├── nightly_patch_notes.md
│   │   ├── records.json
│   │   └── tables_2026.json
│   ├── index.html
│   ├── index.js
│   ├── js/
│   │   ├── backend/
│   │   │   ├── UESaveHandler.js
│   │   │   ├── UESaveTool/
│   │   │   │   ├── Gvas.js
│   │   │   │   ├── GvasHeader.js
│   │   │   │   ├── LICENSE
│   │   │   │   ├── PropertyErrors.js
│   │   │   │   ├── Serializer.js
│   │   │   │   ├── arrays/
│   │   │   │   │   ├── IntArray.js
│   │   │   │   │   ├── SoftObjectArray.js
│   │   │   │   │   ├── StructArray.js
│   │   │   │   │   └── index.js
│   │   │   │   ├── factories.js
│   │   │   │   ├── index.js
│   │   │   │   └── properties/
│   │   │   │       ├── ArrayProperty.js
│   │   │   │       ├── BoolProperty.js
│   │   │   │       ├── EnumProperty.js
│   │   │   │       ├── FloatProperty.js
│   │   │   │       ├── Guid.js
│   │   │   │       ├── Int16Property.js
│   │   │   │       ├── Int64Property.js
│   │   │   │       ├── Int8Property.js
│   │   │   │       ├── IntProperty.js
│   │   │   │       ├── ObjectProperty.js
│   │   │   │       ├── Property.js
│   │   │   │       ├── SoftObjectProperty.js
│   │   │   │       ├── StrProperty.js
│   │   │   │       ├── StrProperty_.js
│   │   │   │       ├── StructProperty.js
│   │   │   │       ├── Tuple.js
│   │   │   │       └── index.js
│   │   │   ├── command.js
│   │   │   ├── commandGlobals.js
│   │   │   ├── dbManager.js
│   │   │   ├── scriptUtils/
│   │   │   │   ├── calendarUtils.js
│   │   │   │   ├── carAnalysisUtils.js
│   │   │   │   ├── carConstants.js
│   │   │   │   ├── countries.js
│   │   │   │   ├── createStaffUtils.js
│   │   │   │   ├── dbUtils.js
│   │   │   │   ├── editTeamUtils.js
│   │   │   │   ├── eidtStatsUtils.js
│   │   │   │   ├── head2head.js
│   │   │   │   ├── modUtils.js
│   │   │   │   ├── newsUtils.js
│   │   │   │   ├── recordUtils.js
│   │   │   │   ├── regulationsUtils.js
│   │   │   │   ├── transferUtils.js
│   │   │   │   └── triggerUtils.js
│   │   │   └── worker.js
│   │   └── frontend/
│   │       ├── calendar.js
│   │       ├── config.js
│   │       ├── devTools.js
│   │       ├── dragFile.js
│   │       ├── head2head.js
│   │       ├── news.js
│   │       ├── performance.js
│   │       ├── recentsManager.js
│   │       ├── regulations.js
│   │       ├── renderer.js
│   │       ├── seasonMods.js
│   │       ├── seasonViewer.js
│   │       ├── stats.js
│   │       ├── teamReplacements.js
│   │       ├── teams.js
│   │       └── transfers.js
│   ├── styles.css
│   └── themes.css
├── vercel.json
└── webpack.config.js
Download .txt
SYMBOL INDEX (1194 symbols across 67 files)

FILE: api/ask-openai.js
  function handler (line 10) | async function handler(req, res) {

FILE: api/auth/patreon/login.js
  function handler (line 1) | function handler(req, res) {

FILE: api/auth/patreon/logout.js
  function handler (line 3) | function handler(req, res) {

FILE: api/auth/patreon/verify.js
  function handler (line 5) | async function handler(req, res) {

FILE: api/check-cookie.js
  function handler (line 4) | function handler(req, res) {

FILE: api/me.js
  function handler (line 4) | function handler(req, res) {

FILE: api/usage-today.js
  function handler (line 5) | async function handler(req, res) {

FILE: lib/accessControl.js
  constant TIER_ORDER (line 1) | const TIER_ORDER = {
  function normalizeName (line 8) | function normalizeName(name) {
  function parseEnvList (line 12) | function parseEnvList(value) {
  function maxTier (line 22) | function maxTier(a, b) {
  function getEffectiveTier (line 35) | function getEffectiveTier({ name, baseTier }) {

FILE: lib/getUserTierServer.js
  function getUserTierServer (line 4) | function getUserTierServer(req) {

FILE: lib/rateLimits.js
  function getDailyLimitForTier (line 1) | function getDailyLimitForTier(tier) {

FILE: src/js/backend/UESaveTool/Gvas.js
  class Gvas (line 8) | class Gvas {
    method constructor (line 9) | constructor() {
    method Size (line 13) | get Size() {
    method deserialize (line 19) | deserialize(serial) {
    method serialize (line 28) | serialize() {
    method from (line 37) | static from(obj) {

FILE: src/js/backend/UESaveTool/GvasHeader.js
  class GvasHeader (line 6) | class GvasHeader {
    method constructor (line 7) | constructor() {
    method Size (line 26) | get Size() {
    method deserialize (line 41) | deserialize(serial) {
    method serialize (line 70) | serialize() {
    method from (line 93) | static from(obj) {

FILE: src/js/backend/UESaveTool/PropertyErrors.js
  class SerializationError (line 1) | class SerializationError extends Error {
    method constructor (line 2) | constructor(prop) {
  class DeserializationError (line 7) | class DeserializationError extends Error {
    method constructor (line 8) | constructor(type, offset) {
  class TypeNotImplementedError (line 13) | class TypeNotImplementedError extends Error {
    method constructor (line 14) | constructor(type) {

FILE: src/js/backend/UESaveTool/Serializer.js
  class Serializer (line 3) | class Serializer {
    method constructor (line 4) | constructor(buf) {
    method Data (line 8) | get Data() { return this._data }
    method tell (line 9) | get tell() { return this._offset }
    method seek (line 10) | seek(count) {
    method read (line 15) | read(count) {
    method readInt32 (line 18) | readInt32() {
    method readUInt32 (line 23) | readUInt32() {
    method readInt64 (line 28) | readInt64() {
    method readInt16 (line 39) | readInt16() {
    method readUInt16 (line 44) | readUInt16() {
    method readInt8 (line 49) | readInt8() {
    method readUInt8 (line 54) | readUInt8() {
    method readFloat (line 59) | readFloat() {
    method readString (line 64) | readString() {
    method readUnicodeString (line 70) | readUnicodeString() {
    method write (line 82) | write(buf) {
    method writeInt64 (line 85) | writeInt64(num) {
    method writeUInt32 (line 93) | writeUInt32(num) {
    method writeInt32 (line 96) | writeInt32(num) {
    method writeUInt16 (line 99) | writeUInt16(num) {
    method writeInt16 (line 102) | writeInt16(num) {
    method writeUInt8 (line 105) | writeUInt8(byte) {
    method writeInt8 (line 108) | writeInt8(byte) {
    method writeFloat (line 111) | writeFloat(num) {
    method writeString (line 114) | writeString(str) {
    method writeUTF16String (line 119) | writeUTF16String(str) {
    method writeLatin1String (line 122) | writeLatin1String(str) {
    method append (line 125) | append(buf) {
    method alloc (line 129) | static alloc(size) {

FILE: src/js/backend/UESaveTool/arrays/IntArray.js
  class IntArray (line 6) | class IntArray extends Property {
    method constructor (line 7) | constructor() {
    method Size (line 12) | get Size() {
    method Count (line 19) | get Count() {
    method deserialize (line 22) | deserialize(serial, count) {
    method serialize (line 34) | serialize() {
    method from (line 42) | static from(obj) {

FILE: src/js/backend/UESaveTool/arrays/SoftObjectArray.js
  class SoftObjectArray (line 5) | class SoftObjectArray extends Property {
    method constructor (line 6) | constructor() {
    method Size (line 11) | get Size() {
    method Count (line 19) | get Count() {
    method deserialize (line 22) | deserialize(serial, count) {
    method serialize (line 29) | serialize() {
    method from (line 39) | static from(obj) {

FILE: src/js/backend/UESaveTool/arrays/StructArray.js
  class StructArray (line 4) | class StructArray extends StructProperty {
    method deserialize (line 5) | deserialize(serial, count) {
    method from (line 25) | static from(obj) {

FILE: src/js/backend/UESaveTool/factories.js
  class Factory (line 3) | class Factory {
    method constructor (line 4) | constructor() {
    method create (line 8) | create(obj) {
    method createArray (line 16) | createArray(obj) {

FILE: src/js/backend/UESaveTool/properties/ArrayProperty.js
  class ArrayProperty (line 7) | class ArrayProperty extends Property {
    method constructor (line 8) | constructor() {
    method Size (line 13) | get Size() {
    method HeaderSize (line 23) | get HeaderSize() {
    method ArraySize (line 31) | get ArraySize() {
    method deserialize (line 37) | deserialize(serial) {
    method serialize (line 51) | serialize() {
    method from (line 66) | static from(obj) {

FILE: src/js/backend/UESaveTool/properties/BoolProperty.js
  class BoolProperty (line 5) | class BoolProperty extends Property {
    method constructor (line 6) | constructor() {
    method Size (line 10) | get Size() {
    method deserialize (line 15) | deserialize(serial) {
    method serialize (line 21) | serialize() {
    method from (line 32) | static from(obj) {

FILE: src/js/backend/UESaveTool/properties/EnumProperty.js
  class EnumProperty (line 5) | class EnumProperty extends Property {
    method constructor (line 6) | constructor() {
    method Size (line 11) | get Size() {
    method deserialize (line 18) | deserialize(serial) {
    method serialize (line 25) | serialize() {
    method from (line 38) | static from(obj) {

FILE: src/js/backend/UESaveTool/properties/FloatProperty.js
  class FloatProperty (line 5) | class FloatProperty extends Property {
    method constructor (line 6) | constructor() {
    method Size (line 11) | get Size() {
    method deserialize (line 16) | deserialize(serial) {
    method serialize (line 22) | serialize() {
    method from (line 34) | static from(obj) {

FILE: src/js/backend/UESaveTool/properties/Guid.js
  class Guid (line 6) | class Guid extends Property {
    method constructor (line 7) | constructor() {
    method Size (line 13) | get Size() {
    method deserialize (line 16) | deserialize(serial) {
    method serialize (line 25) | serialize() {
    method from (line 38) | static from(obj) {

FILE: src/js/backend/UESaveTool/properties/Int16Property.js
  class Int16Property (line 5) | class Int16Property extends Property {
    method constructor (line 6) | constructor() {
    method Size (line 11) | get Size() {
    method deserialize (line 16) | deserialize(serial) {
    method serialize (line 22) | serialize() {
    method from (line 34) | static from(obj) {

FILE: src/js/backend/UESaveTool/properties/Int64Property.js
  class Int64Property (line 5) | class Int64Property extends Property {
    method constructor (line 6) | constructor() {
    method Size (line 11) | get Size() {
    method deserialize (line 16) | deserialize(serial) {
    method serialize (line 22) | serialize() {
    method from (line 34) | static from(obj) {

FILE: src/js/backend/UESaveTool/properties/Int8Property.js
  class Int8Property (line 5) | class Int8Property extends Property {
    method constructor (line 6) | constructor() {
    method Size (line 11) | get Size() {
    method deserialize (line 16) | deserialize(serial) {
    method serialize (line 22) | serialize() {
    method from (line 34) | static from(obj) {

FILE: src/js/backend/UESaveTool/properties/IntProperty.js
  class IntProperty (line 5) | class IntProperty extends Property {
    method constructor (line 6) | constructor() {
    method Size (line 11) | get Size() {
    method deserialize (line 16) | deserialize(serial) {
    method serialize (line 22) | serialize() {
    method from (line 34) | static from(obj) {
  class UInt32Property (line 47) | class UInt32Property extends Property {
    method constructor (line 48) | constructor() {
    method Size (line 53) | get Size() {
    method deserialize (line 58) | deserialize(serial) {
    method serialize (line 64) | serialize() {
    method from (line 76) | static from(obj) {

FILE: src/js/backend/UESaveTool/properties/ObjectProperty.js
  class ObjectProperty (line 5) | class ObjectProperty extends Property {
    method constructor (line 6) | constructor() {
    method Size (line 10) | get Size() {
    method deserialize (line 16) | deserialize(serial) {
    method serialize (line 21) | serialize() {
    method from (line 32) | static from(obj) {

FILE: src/js/backend/UESaveTool/properties/Property.js
  class Property (line 2) | class Property {
    method constructor (line 3) | constructor() {
    method Size (line 11) | get Size() {
    method deserialize (line 20) | deserialize(serial, size) {
    method serialize (line 27) | serialize() {
    method from (line 34) | static from(json) {

FILE: src/js/backend/UESaveTool/properties/SoftObjectProperty.js
  class SoftObjectProperty (line 5) | class SoftObjectProperty extends Property {
    method constructor (line 6) | constructor() {
    method Size (line 10) | get Size() {
    method deserialize (line 16) | deserialize(serial) {
    method serialize (line 22) | serialize() {
    method from (line 34) | static from(obj) {

FILE: src/js/backend/UESaveTool/properties/StrProperty.js
  class StrProperty (line 8) | class StrProperty extends Property {
    method constructor (line 9) | constructor() {
    method Encoding (line 14) | get Encoding() {
    method StringEncodedLength (line 18) | get StringEncodedLength() {
    method Size (line 22) | get Size() {
    method deserialize (line 26) | deserialize(serial) {
    method serialize (line 31) | serialize() {
    method from (line 52) | static from(obj) {

FILE: src/js/backend/UESaveTool/properties/StrProperty_.js
  class StrProperty (line 7) | class StrProperty extends Property {
    method constructor (line 8) | constructor() {
    method Encoding (line 14) | get Encoding() {
    method StringEncodedLength (line 18) | get StringEncodedLength() {
    method Size (line 22) | get Size() {
    method deserialize (line 26) | deserialize(serial) {
    method serialize (line 31) | serialize() {
    method from (line 52) | static from(obj) {

FILE: src/js/backend/UESaveTool/properties/StructProperty.js
  class StructProperty (line 5) | class StructProperty extends Property {
    method constructor (line 6) | constructor() {
    method Size (line 11) | get Size() {
    method HeaderSize (line 22) | get HeaderSize() {
    method Count (line 30) | get Count() {
    method deserialize (line 33) | deserialize(serial, size) {
    method serialize (line 51) | serialize() {
    method from (line 66) | static from(obj) {

FILE: src/js/backend/UESaveTool/properties/Tuple.js
  class Tuple (line 6) | class Tuple extends Property {
    method constructor (line 7) | constructor() {
    method Size (line 12) | get Size() {
    method Count (line 20) | get Count() {
    method deserialize (line 23) | deserialize(serial) {
    method serialize (line 34) | serialize() {
    method from (line 44) | static from(obj) {

FILE: src/js/backend/command.js
  class Command (line 7) | class Command {
    method constructor (line 12) | constructor(commandName, data) {
    method execute (line 18) | async execute() {
    method promiseExecute (line 43) | promiseExecute() {
    method updateTeamsFor24 (line 59) | async updateTeamsFor24(year) {
    method replaceTeam (line 76) | replaceTeam(originalTeam, newTeam) {
    method addTeam (line 80) | addTeam(originalTeam, newTeam) {

FILE: src/js/backend/commandGlobals.js
  function setGlobals (line 20) | function setGlobals({dbPath, year, createTeam, date }) {
  function getGlobals (line 27) | function getGlobals() {

FILE: src/js/backend/dbManager.js
  function setDatabase (line 4) | function setDatabase(database, meta) {
  function getDatabase (line 10) | function getDatabase() {
  function getMetadata (line 14) | function getMetadata() {
  function setMetaData (line 18) | function setMetaData(meta) {
  function queryDB (line 33) | function queryDB(query, params = [], type = 'allRows') {

FILE: src/js/backend/scriptUtils/calendarUtils.js
  function fetchCalendar (line 12) | function fetchCalendar() {
  function editCalendar (line 51) | function editCalendar(year_iteration, racesData) {
  function arraysEqual (line 261) | function arraysEqual(a, b) {
  function randomInt (line 269) | function randomInt(min, max) {

FILE: src/js/backend/scriptUtils/carAnalysisUtils.js
  function getBestParts (line 11) | function getBestParts(customTeam = false) {
  function getAllPartsFromTeam (line 28) | function getAllPartsFromTeam(teamId) {
  function getPartsFromTeam (line 118) | function getPartsFromTeam(teamId) {
  function getBestPartsUntil (line 155) | function getBestPartsUntil(day, customTeam = false) {
  function getCarStats (line 199) | function getCarStats(designDict) {
  function getTyreDegStats (line 229) | function getTyreDegStats(designDict) {
  function updateTyreDegStats (line 260) | function updateTyreDegStats(designDictTeamReceiver, designDictTeamGiver,...
  function applyExpertiseBoost (line 282) | function applyExpertiseBoost(boost, team) {
  function applyNextSeasonExpertiseBoost (line 291) | function applyNextSeasonExpertiseBoost(boost, team) {
  function applyBoostToCarStats (line 299) | function applyBoostToCarStats(designDict, boost, team) {
  function applyScaledBoostToStatValue (line 352) | function applyScaledBoostToStatValue(originalValue, statID, boost) {
  function getUnitValueFromParts (line 381) | function getUnitValueFromParts(designDict) {
  function getTeamExpertise (line 404) | function getTeamExpertise(teamId, yearIteration = null) {
  function updateTeamExpertise (line 453) | function updateTeamExpertise(teamId, expertiseUnitValues, yearIteration ...
  function getUnitValueFromOnePart (line 486) | function getUnitValueFromOnePart(designId) {
  function convertPercentageToValue (line 515) | function convertPercentageToValue(attribute, percentage, minMax) {
  function makeAttributesReadable (line 525) | function makeAttributesReadable(attributes) {
  function calculateOverallPerformance (line 543) | function calculateOverallPerformance(attributes) {
  function getContributorsDict (line 555) | function getContributorsDict() {
  function getPartStatsDict (line 585) | function getPartStatsDict(carDict) {
  function calculateCarAttributes (line 603) | function calculateCarAttributes(contributors, partsStats) {
  function getRacesDays (line 622) | function getRacesDays() {
  function getAllRaces (line 652) | function getAllRaces() {
  function buildEnginePowerProgressionContext (line 666) | function buildEnginePowerProgressionContext() {
  function getEnginePowerUnitValueForRace (line 713) | function getEnginePowerUnitValueForRace(engineId, raceId, ctx) {
  function getPerformanceAllTeams (line 743) | function getPerformanceAllTeams(day = null, previous = null, customTeam ...
  function getPerformanceAllCars (line 809) | function getPerformanceAllCars(customTeam = false) {
  function getAttributesAllCars (line 848) | function getAttributesAllCars(customTeam = false) {
  function getDriverNumberWithCar (line 876) | function getDriverNumberWithCar(teamId, carId) {
  function getFittedDesigns (line 903) | function getFittedDesigns(customTeam = false) {
  function fitLatestDesignsAllGrid (line 942) | function fitLatestDesignsAllGrid(customTeam = false) {
  function fitLatestDesignsOneTeam (line 966) | function fitLatestDesignsOneTeam(teamId, parts) {
  function updateItemsForDesignDict (line 1043) | function updateItemsForDesignDict(designDict, teamId) {
  function fitLoadoutsDict (line 1081) | function fitLoadoutsDict(loadoutsDict, teamId) {
  function createNewItem (line 1176) | function createNewItem(designId, part) {
  function deleteItem (line 1217) | function deleteItem(designId) {
  function addNewDesign (line 1239) | function addNewDesign(part, teamId, day, season, latestDesignPartFromTea...
  function copyFromTable (line 1309) | function copyFromTable(table, latestDesignId, newDesignId) {
  function add4Items (line 1332) | function add4Items(newDesignId, part, teamId) {
  function addPartToLoadout (line 1363) | function addPartToLoadout(designId, part, teamId, loadoutId, itemId) {
  function overwritePerformanceTeam (line 1379) | function overwritePerformanceTeam(teamId, performance, customTeam = null...
  function changeExpertiseBased (line 1501) | function changeExpertiseBased(part, stat, newValue, teamId, type = "exis...
  function getPerformanceAllTeamsSeason (line 1569) | function getPerformanceAllTeamsSeason(customTeam = false, options = {}) {
  function getAduoEngineUpgradeRaceIds (line 1597) | function getAduoEngineUpgradeRaceIds(seasonId = null) {
  function getFirstDaySeason (line 1621) | function getFirstDaySeason() {
  function getAttributesAllTeams (line 1642) | function getAttributesAllTeams(customTeam = false) {
  function getOneStatUnitValueFromTeam (line 1661) | function getOneStatUnitValueFromTeam(part, stat, teamId) {
  function getMaxDesign (line 1680) | function getMaxDesign() {
  function deleteCustomEngineAndReassign (line 1688) | function deleteCustomEngineAndReassign(engineIdRaw, fallbackEngineIdRaw) {

FILE: src/js/backend/scriptUtils/createStaffUtils.js
  constant DRIVER_STAT_IDS (line 4) | const DRIVER_STAT_IDS = [2, 3, 4, 5, 6, 7, 8, 9, 10];
  constant STAFF_STAT_IDS (line 5) | const STAFF_STAT_IDS = {
  constant STAFF_TYPE_NAMES (line 12) | const STAFF_TYPE_NAMES = {
  function fetchRandomStaffDraft (line 20) | function fetchRandomStaffDraft(typeStaffRaw, gameYear = "24") {
  function fetchRandomDraftForename (line 72) | function fetchRandomDraftForename(genderRaw, staffNameLocaleRaw) {
  function fetchCountryLocaleForCode (line 96) | function fetchCountryLocaleForCode(codeRaw) {
  function normalizeStaffType (line 116) | function normalizeStaffType(typeStaffRaw) {
  function buildAgeDetails (line 124) | function buildAgeDetails(typeStaff) {
  function buildRandomStats (line 148) | function buildRandomStats(typeStaff) {
  function pickRandomForename (line 162) | function pickRandomForename(gender, staffNameLocale = null) {
  function pickRandomSurname (line 178) | function pickRandomSurname(staffNameLocale = null) {
  function pickRandomNationality (line 193) | function pickRandomNationality(gameYear) {
  function fetchCountryCode (line 227) | function fetchCountryCode(nationalityName) {
  function pickAvailableDriverNumber (line 231) | function pickAvailableDriverNumber() {
  function buildDriverCode (line 243) | function buildDriverCode(firstName, lastName) {
  function extractNameToken (line 248) | function extractNameToken(value) {
  function removeTrailingDigits (line 268) | function removeTrailingDigits(value) {
  function randomInt (line 272) | function randomInt(min, max) {
  function clampInt (line 276) | function clampInt(n, min, max) {
  function pickBaseRating (line 280) | function pickBaseRating(typeStaff) {
  function statAroundBase (line 287) | function statAroundBase(base, spread, { min, max }) {

FILE: src/js/backend/scriptUtils/dbUtils.js
  function argbToHex (line 13) | function argbToHex(argb) {
  function hexToArgb (line 18) | function hexToArgb(hex) {
  function hexToDbArgb (line 42) | function hexToDbArgb(hex, defaultAlpha = 255) {
  function clampByte (line 73) | function clampByte(n) {
  function getDate (line 79) | function getDate() {
  function checkYearSave (line 92) | function checkYearSave() {
  function fetchNationality (line 148) | function fetchNationality(driverID, gameYear) {
  function fetchForFutureContract (line 192) | function fetchForFutureContract(driverID) {
  function fetchJuniorContracts (line 213) | function fetchJuniorContracts(driverID) {
  function fetchEngines (line 234) | function fetchEngines() {
  function ensureCustomEngineProgressionTable (line 299) | function ensureCustomEngineProgressionTable() {
  function getNextSnapshotRaceIdForSeason (line 317) | function getNextSnapshotRaceIdForSeason(seasonId) {
  function snapshotEnginePowerProgression (line 341) | function snapshotEnginePowerProgression(engineIdsRaw, source, seasonIdRa...
  function fetchMentality (line 382) | function fetchMentality(staffID) {
  function checkDrivesForTeam32 (line 400) | function checkDrivesForTeam32(staffData) {
  function removeNumber (line 426) | function removeNumber(str) {
  function formatNamesAndFetchStats (line 433) | function formatNamesAndFetchStats(nameData, type) {
  function fetchDriverRetirement (line 532) | function fetchDriverRetirement(driverID) {
  function fetchDriverCode (line 561) | function fetchDriverCode(driverID) {
  function fetchYear (line 581) | function fetchYear() {
  function fetchDriverNumberDetails (line 595) | function fetchDriverNumberDetails(driverID) {
  function fetchRaceFormula (line 629) | function fetchRaceFormula(driverID) {
  function fetchMarketability (line 647) | function fetchMarketability(driverID) {
  function fetchSuperlicense (line 655) | function fetchSuperlicense(driverID) {
  function fetchDrivers (line 663) | function fetchDrivers(gameYear) {
  function fetchStaff (line 739) | function fetchStaff(gameYear) {
  function fetchDriversPerYear (line 814) | function fetchDriversPerYear(year) {
  function formatNamesSimple (line 843) | function formatNamesSimple(name) {
  function getSeasonRaceIds (line 897) | function getSeasonRaceIds(season) {
  function buildPerRaceTeamRankContext (line 906) | function buildPerRaceTeamRankContext(seasonResults, raceIds, season) {
  function buildPerRaceTeamRankContext_OLD (line 954) | function buildPerRaceTeamRankContext_OLD(seasonResults, raceIds, season) {
  function applyDoDFlagsToSeasonResults (line 976) | function applyDoDFlagsToSeasonResults(seasonResults, dodMap) {
  function getDotDWinnersMap (line 988) | function getDotDWinnersMap(season) {
  function computeSeasonDriverOfTheDay (line 1002) | function computeSeasonDriverOfTheDay(seasonResults, season) {
  function fetchSeasonResults (line 1056) | function fetchSeasonResults(
  function fetchQualiResults (line 1087) | function fetchQualiResults(yearSelected) {
  function fetchTeamsStandings (line 1106) | function fetchTeamsStandings(year, formula = 1) {
  function fetchTeamsStandingsWithPoints (line 1116) | function fetchTeamsStandingsWithPoints(year, formula = 1) {
  function fetchTeamSeasonCountsFromRaceResults (line 1126) | function fetchTeamSeasonCountsFromRaceResults(year, extraWhereSql) {
  function fetchTeamSeasonWinsTotals (line 1148) | function fetchTeamSeasonWinsTotals(year, formula = 1) {
  function fetchTeamSeasonPodiumsTotals (line 1153) | function fetchTeamSeasonPodiumsTotals(year, formula = 1) {
  function fetchTeamSeasonPolesTotals (line 1158) | function fetchTeamSeasonPolesTotals(year, formula = 1) {
  function fetchDriversStandings (line 1163) | function fetchDriversStandings(year, formula = 1) {
  function fetchTeamsStandingsWithPositionChange (line 1246) | function fetchTeamsStandingsWithPositionChange(year, formula = 1) {
  function fetchPointsRegulations (line 1256) | function fetchPointsRegulations() {
  function fetchOneTeamSeasonResults (line 1275) | function fetchOneTeamSeasonResults(team, year) {
  function fetchOneDriverSeasonResults (line 1296) | function fetchOneDriverSeasonResults(driver, year, isCurrentYear = true,...
  function computeDriverOfTheDayFromRows (line 1386) | function computeDriverOfTheDayFromRows(rows, raceId, opts = {}) {
  function computeDriverOfTheDayFromRows_fast (line 1394) | function computeDriverOfTheDayFromRows_fast(rows, raceId, opts = {}) {
  function computeDriverOfTheDayLeaderboardFromRows (line 1486) | function computeDriverOfTheDayLeaderboardFromRows(rows, raceId, opts = {...
  function softmaxToPercent (line 1582) | function softmaxToPercent(values, temperature = 1.0) {
  function softmaxToPercentBounded (line 1590) | function softmaxToPercentBounded(values, opts = {}) {
  function roundPercentsToTargetSum (line 1637) | function roundPercentsToTargetSum(values, opts = {}) {
  function upsertDoDRanking (line 1682) | function upsertDoDRanking(season, raceId, leaderboard, topN = 3) {
  function getDoDTopNForRace (line 1699) | function getDoDTopNForRace(season, raceId, topN = 3) {
  function ensureCustomDoDRankingTable (line 1717) | function ensureCustomDoDRankingTable() {
  function fetchDriverOfTheDayCounts (line 1733) | function fetchDriverOfTheDayCounts(season) {
  function fetchTeamMateQualiRaceHeadToHead (line 1774) | function fetchTeamMateQualiRaceHeadToHead(season) {
  function seededRandom (line 1893) | function seededRandom(seed) {
  function getNameByIdAndFormat (line 1902) | function getNameByIdAndFormat(driverID) {
  function fetchOneDriverQualiResults (line 1914) | function fetchOneDriverQualiResults(driver, year) {
  function fetchEventsDoneFrom (line 1950) | function fetchEventsDoneFrom(year) {
  function fetchEventsDoneBefore (line 1974) | function fetchEventsDoneBefore(year, day) {
  function fetchEventsFrom (line 1997) | function fetchEventsFrom(year, formula = 1) {
  function fetchLastCompletedRaceId (line 2015) | function fetchLastCompletedRaceId(year, formula = 1) {
  function fetchPracticeResultsRows (line 2034) | function fetchPracticeResultsRows(raceId, practiceSession = 1) {
  function fetchRaceResultsRows (line 2063) | function fetchRaceResultsRows(raceId) {
  function fetchSprintResultsRows (line 2087) | function fetchSprintResultsRows(raceId) {
  function fetchQualifyingResultsRows (line 2109) | function fetchQualifyingResultsRows(raceId, sprintShootout = 0) {
  function buildQualifyingGridPositionMap (line 2164) | function buildQualifyingGridPositionMap(rows) {
  function fetchSessionResults (line 2209) | function fetchSessionResults(raceId, sessionKey, gameYear = "24") {
  function formatDriverName (line 2393) | function formatDriverName(driverName) {
  function formatSeasonResultsF2F3 (line 2414) | function formatSeasonResultsF2F3(
  function formatSeasonResults (line 2537) | function formatSeasonResults(
  function calculateTimeToPole (line 2811) | function calculateTimeToPole(driverID, raceID) {
  function calculateTimeDifference (line 2846) | function calculateTimeDifference(driverID, raceID) {
  function fetchDriverNumbers (line 2893) | function fetchDriverNumbers() {
  function fetchDriverContracts (line 2901) | function fetchDriverContracts(id) {
  function formatStaffNameFromLocKeys (line 2942) | function formatStaffNameFromLocKeys(firstNameLocKey, lastNameLocKey) {
  function fetchJuniorTeamDriverNames (line 2969) | function fetchJuniorTeamDriverNames(teamId) {
  function checkCustomTables (line 3002) | function checkCustomTables(year) {
  function fixCustomEnginesStatsTable (line 3115) | function fixCustomEnginesStatsTable() {
  function wipeTableAndRefill (line 3156) | function wipeTableAndRefill(tableName, data){
  function insertDefualtEnginesData (line 3165) | function insertDefualtEnginesData(list, stats, allocations, customSave, ...
  function updateCustomEngines (line 3294) | function updateCustomEngines(engineData) {
  function editEngines (line 3321) | function editEngines(engineData) {
  function check2025ModCompatibility (line 3346) | function check2025ModCompatibility(year_version) {
  function check2026ModCompatibility (line 3389) | function check2026ModCompatibility(year_version) {
  function ensureSeasonModTable (line 3470) | function ensureSeasonModTable(tableName, defaultKeys) {
  function updateTeamsSuppliedByEngine (line 3485) | function updateTeamsSuppliedByEngine(engineId, stats) {
  function updateCustomConfig (line 3510) | function updateCustomConfig(data) {
  function updateTeam (line 3660) | function updateTeam(teamID) {
  function fetchCustomConfig (line 3676) | function fetchCustomConfig() {
  function setCustomSaveConfig (line 3742) | function setCustomSaveConfig(key, value) {
  function fetchPlayerTeam (line 3749) | function fetchPlayerTeam() {
  function fetch2025ModData (line 3758) | function fetch2025ModData() {
  function fetch2026ModData (line 3774) | function fetch2026ModData() {
  function createEngineMigrationTrigger (line 3797) | function createEngineMigrationTrigger() {

FILE: src/js/backend/scriptUtils/editTeamUtils.js
  function fetchTeamData (line 3) | function fetchTeamData(teamID){
  function manageCostCap (line 94) | function manageCostCap(teamID, amount) {
  function editTeam (line 148) | function editTeam(info) {
  function manage_engine_change (line 226) | function manage_engine_change(teamID, engineId) {

FILE: src/js/backend/scriptUtils/eidtStatsUtils.js
  function editStats (line 35) | function editStats(driverID, type, stats, retirement, driverNum, wants1) {
  function changeDriverNumber (line 212) | function changeDriverNumber(driverID, newNumber) {
  function editName (line 250) | function editName(driverID, newName) {
  function editCode (line 264) | function editCode(driverID, newCode) {
  function excelToDate (line 274) | function excelToDate(excelDate) {
  function dateToExcel (line 279) | function dateToExcel(date) {
  function excelFromYMD (line 285) | function excelFromYMD(year, month, day) {
  function changeYearsInExcelDate (line 290) | function changeYearsInExcelDate(excelDate, years) {
  function editAge (line 302) | function editAge(driverID, ageGap) {
  function editMentality (line 320) | function editMentality(driverID, mentalityStr) {
  function editRetirement (line 363) | function editRetirement(driverID, value) {
  function editSuperlicense (line 371) | function editSuperlicense(driverID, value) {
  function editMarketability (line 380) | function editMarketability(driverID, value) {
  function setAllDriversStatsTo85 (line 388) | function setAllDriversStatsTo85() {

FILE: src/js/backend/scriptUtils/head2head.js
  function fetchHead2Head (line 19) | function fetchHead2Head(driver1ID, driver2ID, year, isCurrentYear = true) {
  function fetchHead2HeadTeam (line 417) | function fetchHead2HeadTeam(teamID1, teamID2, year, isCurrentYear = true) {

FILE: src/js/backend/scriptUtils/modUtils.js
  function resetStaffIDChanges (line 18) | function resetStaffIDChanges() {
  function timeTravelWithData (line 23) | function timeTravelWithData(dayNumber, extend = false, mod = "2025") {
  function changeDriverLineUps (line 274) | function changeDriverLineUps() {
  function modFire (line 398) | function modFire(driverID, teamID, PosInTeam) {
  function changeStats (line 436) | function changeStats() {
  function changeDriverEngineerPairs (line 456) | function changeDriverEngineerPairs() {
  function change2024Standings (line 498) | function change2024Standings(mod = "2025") {
  function manageFeederSeries (line 531) | function manageFeederSeries() {
  function manageAffiliates (line 560) | function manageAffiliates() {
  function manageStandings (line 604) | function manageStandings() {
  function changeRaces (line 715) | function changeRaces(type) {
  function updateCalendar2026 (line 848) | function updateCalendar2026(type) {
  function insertStaff2025 (line 1001) | function insertStaff2025() {
  function changeBudgets (line 1024) | function changeBudgets(amount = 15000000) {
  function removeFastestLap (line 1029) | function removeFastestLap(mod = "2025") {
  function updateSeasonModTable (line 1036) | function updateSeasonModTable(edit, value, mod = "2025") {
  function updatePerofmrnace2025 (line 1041) | function updatePerofmrnace2025() {
  function fixes_mod (line 1066) | function fixes_mod() {
  function updateEditsWithModData (line 1092) | function updateEditsWithModData(data) {
  function updateRenaultToHonda (line 1112) | function updateRenaultToHonda(isHonda) {
  function addAudiCustomEngine (line 1118) | function addAudiCustomEngine(unitValue = 80) {
  function apply2026EnginePerformanceChanges (line 1155) | function apply2026EnginePerformanceChanges() {
  function insertStaff2026 (line 1198) | function insertStaff2026() {
  function changeStats2026 (line 1308) | function changeStats2026() {
  function changeLineUps2026 (line 1393) | function changeLineUps2026() {
  function changeDriverNumbers2026 (line 1497) | function changeDriverNumbers2026() {
  function updatePerofmrnace2026 (line 1515) | function updatePerofmrnace2026() {
  function fixStandings (line 1565) | function fixStandings(forSeason = "2025") {
  function changeAdditionalRegulations2026 (line 1578) | function changeAdditionalRegulations2026() {
  function change2025Standings (line 1593) | function change2025Standings(mod = "2026") {
  function fixesMod2026 (line 1637) | function fixesMod2026() {
  function updateRecordsTo2026 (line 1659) | function updateRecordsTo2026() {
  function updateFacilities2026 (line 1674) | function updateFacilities2026() {

FILE: src/js/backend/scriptUtils/newsUtils.js
  constant USE_COMPRESSION (line 15) | const USE_COMPRESSION = false;
  function isTimeTravel2026Enabled (line 21) | function isTimeTravel2026Enabled() {
  function loadTurningPointsFrequencyConfig (line 40) | function loadTurningPointsFrequencyConfig() {
  function getTurningPointChance (line 57) | function getTurningPointChance(tpType, tpConfig) {
  function getTurningPointMax (line 65) | function getTurningPointMax(tpType, tpConfig) {
  function fetchSeasonResultsCached (line 76) | function fetchSeasonResultsCached(season) {
  function rebuildStandingsUntilCached (line 83) | function rebuildStandingsUntilCached(season, seasonResults, raceId, incl...
  function generate_news (line 91) | function generate_news(savednews, turningPointState) {
  function generateTurningResponse (line 190) | function generateTurningResponse(turningPointData, type, maxDate, outcom...
  function applyAduoEffect (line 347) | function applyAduoEffect(turningPointData) {
  function applyRaceSubstitution (line 409) | function applyRaceSubstitution(turningPointData) {
  function applyInvestmentEffect (line 416) | function applyInvestmentEffect(turningPointData) {
  function executeMidSeasonTransfer (line 460) | function executeMidSeasonTransfer(turningPointData) {
  function applyTechnicalDirectiveEffect (line 505) | function applyTechnicalDirectiveEffect(turningPointData) {
  function generateRaceSubstitutionTurningPointNews (line 536) | function generateRaceSubstitutionTurningPointNews(currentMonth, savednew...
  function generateInvestmentTurningPointNews (line 690) | function generateInvestmentTurningPointNews(currentMonth, savednews = {}...
  function generateDriverInjuryTurningPointNews (line 794) | function generateDriverInjuryTurningPointNews(currentMonth, savednews = ...
  function generateEnginesTurningPointNews (line 1101) | function generateEnginesTurningPointNews(currentMonth, savednews = {}, t...
  function generateAduoTurningPointsNews (line 1326) | function generateAduoTurningPointsNews(currentMonth, savednews = {}, tur...
  function generateYoungDriversTurningPointNews (line 1509) | function generateYoungDriversTurningPointNews(currentMonth, savednews = ...
  function applyYoungDriversBoost (line 1760) | function applyYoungDriversBoost(turningPointData) {
  function boostDriverStats (line 1771) | function boostDriverStats(driverId) {
  function boostDriverGrowth (line 1804) | function boostDriverGrowth(driverId) {
  function clampValue (line 1826) | function clampValue(value, min, max) {
  function randomIntBetween (line 1830) | function randomIntBetween(min, max) {
  function generateTechnicalDirectiveTurningPointNews (line 1837) | function generateTechnicalDirectiveTurningPointNews(currentMonth, savedn...
  function generateMidSeasonTransfersTurningPointNews (line 2025) | function generateMidSeasonTransfersTurningPointNews(monthsDone, currentM...
  function generateDSQTurningPointNews (line 2330) | function generateDSQTurningPointNews(racesDone, savednews = {}, turningP...
  function getMaxPointsForRace (line 2435) | function getMaxPointsForRace(raceId, pointsSchema, seasonId = null) {
  function championshipStatus (line 2463) | function championshipStatus(
  function generateChampionMilestones (line 2515) | function generateChampionMilestones(racesDone, savednews = {}) {
  function getCircuitInfo (line 2721) | function getCircuitInfo(raceId) {
  function getCustomNewsOptions (line 2728) | function getCustomNewsOptions() {
  function getOfficialF1DriverIdsForCustomNews (line 2810) | function getOfficialF1DriverIdsForCustomNews(teamId = null) {
  function assertOfficialF1DriverForCustomNews (line 2828) | function assertOfficialF1DriverForCustomNews(driverId, label = "Driver") {
  function isOfficialF1DriverForCustomNews (line 2845) | function isOfficialF1DriverForCustomNews(driverId) {
  function assertActiveDriverForCustomNews (line 2860) | function assertActiveDriverForCustomNews(driverId, label = "Driver") {
  function assertCompletedRaceForCustomNews (line 2878) | function assertCompletedRaceForCustomNews(raceId, label = "Race") {
  function getRaceDriversForCustomNews (line 2885) | function getRaceDriversForCustomNews(raceId) {
  function isoToExcelDay (line 2899) | function isoToExcelDay(iso) {
  function getDriverAndTeamForCustomNews (line 2907) | function getDriverAndTeamForCustomNews(driverId) {
  function renderNormalTitleTemplate (line 2927) | function renderNormalTitleTemplate(data, new_type, templateIndex) {
  function renderTurningPointTitleTemplate (line 2945) | function renderTurningPointTitleTemplate(data, new_type, turningPointTyp...
  function assertCustomTurningPointPayload (line 2959) | function assertCustomTurningPointPayload(type, data) {
  function createCustomNewsEntry (line 3053) | function createCustomNewsEntry(input = {}) {
  function randomRemovalOfNames (line 4173) | function randomRemovalOfNames(data) {
  function generateTurningPointTitle (line 4220) | function generateTurningPointTitle(data, new_type, turningPointType) {
  function generateTitle (line 4240) | function generateTitle(data, new_type) {
  function generateF2AndF3ReviewNews (line 4260) | function generateF2AndF3ReviewNews(currentMonth, savedNews) {
  function generateFakeTransferNews (line 4336) | function generateFakeTransferNews(monthsDone, savedNews, bigConfirmedTra...
  function generateBigConfirmedTransferNews (line 4594) | function generateBigConfirmedTransferNews(savedNews = {}, currentMonth) {
  function buildGridLineupsData (line 4730) | function buildGridLineupsData(season) {
  function getCurrentAndNextSeasonGridLineups (line 4844) | function getCurrentAndNextSeasonGridLineups() {
  function generateNextSeasonGridNews (line 4851) | function generateNextSeasonGridNews(savedNews = {}, currentMonth) {
  function generateContractRenewalsNews (line 4898) | function generateContractRenewalsNews(savedNews = {}, contractRenewals =...
  function getContractExtensions (line 4951) | function getContractExtensions() {
  function getTrueTransferRumors (line 5015) | function getTrueTransferRumors() {
  function getConfirmedTransfers (line 5129) | function getConfirmedTransfers(bestDrivers = false) {
  function generateTransferRumorsNews (line 5190) | function generateTransferRumorsNews(offers, savedNews) {
  function generateTeamsUpgradesNews (line 5296) | function generateTeamsUpgradesNews(events, savednews) {
  function generateComparisonNews (line 5340) | function generateComparisonNews(comparisonMonths, savedNews) {
  function generateRaceResultsNews (line 5479) | function generateRaceResultsNews(events, savednews) {
  function generateRaceReactionsNews (line 5554) | function generateRaceReactionsNews(events, savednews) {
  function generateQualifyingResultsNews (line 5664) | function generateQualifyingResultsNews(events, savednews) {
  function generateSeasonReviewNews (line 5740) | function generateSeasonReviewNews(savedNews) {
  function news_insert_space (line 5832) | function news_insert_space(str) {
  function getOneQualiDetails (line 5839) | function getOneQualiDetails(raceId) {
  function getOneRaceDetails (line 5902) | function getOneRaceDetails(raceId) {
  function getOneRaceResults (line 6025) | function getOneRaceResults(raceId, sprint = false) {
  function getOneQualifyingResults (line 6052) | function getOneQualifyingResults(raceId) {
  function rebuildStandingsUntil (line 6079) | function rebuildStandingsUntil(seasonResultsRaw, raceId, includeCurrentR...
  function getLatestChampions (line 6184) | function getLatestChampions(seasonId) {
  function getImagePath (line 6225) | function getImagePath(teamId, code, type) {
  function calculateTeamDropsByDate (line 6344) | function calculateTeamDropsByDate(season, date) {
  function getTransferDetails (line 6388) | function getTransferDetails(drivers, date = null) {
  function getTeamComparisonDetails (line 6442) | function getTeamComparisonDetails(teamId, season, date) {
  function getFullChampionSeasonDetails (line 6502) | function getFullChampionSeasonDetails(season) {
  function getFullFeederSeriesDetails (line 6544) | function getFullFeederSeriesDetails(season) {
  function buildFeederSeriesSeasonDetails (line 6551) | function buildFeederSeriesSeasonDetails(season, formula) {
  function getPreviouslyDrivenTeams (line 6649) | function getPreviouslyDrivenTeams(driverId) {
  function buildPointsTable (line 6668) | function buildPointsTable(positionAndPointsRows) {
  function getBasePointsForPos (line 6677) | function getBasePointsForPos(pos, pointsTable, doublePoints, isLastRace ...
  function getFastestLapHolderBySeconds (line 6683) | function getFastestLapHolderBySeconds(raceId, queryDB) {
  function checkDoublePointsBug (line 6694) | function checkDoublePointsBug(turningPointState){
  function fixDoublePointsBug (line 6732) | function fixDoublePointsBug(raceId) {
  function disqualifyTeamInRace (line 6760) | function disqualifyTeamInRace({
  function getRandomInt (line 6982) | function getRandomInt(min, max) {
  function ensureEditorStateTable (line 6997) | function ensureEditorStateTable() {
  function getEditorState (line 7006) | function getEditorState(key) {
  function setEditorState (line 7012) | function setEditorState(key, valueText) {
  function computeStableKey (line 7021) | function computeStableKey(n) {
  function loadNewsMapFromDB (line 7028) | function loadNewsMapFromDB(season = null) {
  function saveNewsToDBMap (line 7037) | function saveNewsToDBMap(map) {
  function deleteNews (line 7044) | function deleteNews() {
  function deleteTurningPoints (line 7051) | function deleteTurningPoints() {
  function upsertNews (line 7058) | function upsertNews(newsList = []) {
  function loadTPFromDB (line 7085) | function loadTPFromDB(season = null) {
  function saveTPToDBMap (line 7094) | function saveTPToDBMap(map) {
  function upsertTurningPoints (line 7101) | function upsertTurningPoints(tpPartial = {}) {
  function updateNewsFields (line 7114) | function updateNewsFields(stableKey, patch) {
  function deleteNewByKey (line 7130) | function deleteNewByKey(stableKey) {
  function isMigrationDone (line 7140) | function isMigrationDone() {
  function markMigrationDone (line 7143) | function markMigrationDone() {
  function safeParse (line 7148) | function safeParse(txt, fallback) {
  function mergeNewsMaps (line 7152) | function mergeNewsMaps(dbMap, lsMap) {
  function mergeTPMaps (line 7156) | function mergeTPMaps(dbMap, lsMap) {
  function migrateLegacyData (line 7167) | function migrateLegacyData(lsNewsTxt, lsTPTxt) {
  function ensureTurningPointsStructure (line 7188) | function ensureTurningPointsStructure() {
  function getNewsAndTpYearsAvailable (line 7221) | function getNewsAndTpYearsAvailable() {
  function getNewsFromSeason (line 7243) | function getNewsFromSeason(season) {
  function startInjurySwap (line 7250) | function startInjurySwap(injuredId, reserveData, endDay) {
  function applyDriverInjury (line 7271) | function applyDriverInjury(turningPointData) {

FILE: src/js/backend/scriptUtils/recordUtils.js
  function idsToCsv (line 5) | function idsToCsv(ids) {
  function fetchHistoryMap (line 9) | function fetchHistoryMap(tableName, ids) {
  function fetchDriverHistoryRecords (line 46) | function fetchDriverHistoryRecords(historyTable, ids, season) {
  function validSeason (line 141) | function validSeason(x) {
  function enrichDriversWithHistory (line 145) | function enrichDriversWithHistory(drivers, season = null) {
  function getSelectedRecord (line 206) | function getSelectedRecord(type, year) {
  function fetchSeasonReviewData (line 382) | function fetchSeasonReviewData(year, formula = 1, isCurrentYear = true) {
  function getSelectedTeamRecord (line 418) | function getSelectedTeamRecord(type, year, formula = 1) {
  function fetchQualifyingStageCounts (line 567) | function fetchQualifyingStageCounts(year, formula = 1, isCurrentYear = t...
  function pickValueFromType (line 691) | function pickValueFromType(item, type) {
  function mapExternalItem (line 705) | function mapExternalItem(item, type) {
  function aggregateSeasonDriverRecords (line 734) | function aggregateSeasonDriverRecords(records) {
  function mergeWithExternalRecords (line 764) | function mergeWithExternalRecords(dbDrivers, externalJson, type, year) {
  function fetchRacePointsSnapshot (line 784) | function fetchRacePointsSnapshot(raceIdNum) {
  function fetchSprintPointsSnapshot (line 808) | function fetchSprintPointsSnapshot(raceIdNum) {
  function fetchSprintPosToPointsMap (line 833) | function fetchSprintPosToPointsMap(raceIdNum) {
  function fetchRaceDriverRecordsSnapshot (line 853) | function fetchRaceDriverRecordsSnapshot(raceIdNum) {
  function diffPointsMaps (line 882) | function diffPointsMaps(newMap, oldMap) {
  function diffDriverRecordMaps (line 894) | function diffDriverRecordMaps(newMap, oldMap) {
  function resortF1StandingsForSeason (line 913) | function resortF1StandingsForSeason(seasonId) {
  function editRaceResults (line 1059) | function editRaceResults(raceId, edits = [], opts = {}) {

FILE: src/js/backend/scriptUtils/regulationsUtils.js
  function fetchRegulationsData (line 3) | function fetchRegulationsData() {
  function isRowPresent (line 56) | function isRowPresent(query, params) {
  function updateOneRegulationEnumChange (line 61) | function updateOneRegulationEnumChange(name, currentValue, minValue, max...
  function updateRegulations (line 72) | function updateRegulations(data) {

FILE: src/js/backend/scriptUtils/transferUtils.js
  constant CONTRACT_PLACEHOLDERS_24 (line 59) | let CONTRACT_PLACEHOLDERS_24 = {
  function isBlankContractValue (line 70) | function isBlankContractValue(value) {
  function toContractInt (line 74) | function toContractInt(value, fallback) {
  function sanitizeContractPayload (line 80) | function sanitizeContractPayload(payload = {}) {
  function getCurrentMainContractSnapshot (line 119) | function getCurrentMainContractSnapshot(driverID) {
  function checkAndFixContract (line 140) | function checkAndFixContract(driverID, teamID) {
  function transferJuniorDriver (line 210) | function transferJuniorDriver(driverID,newTeamID, posInTeam, yearIterati...
  function hireDriver (line 267) | function hireDriver(type,driverID,teamID,position,salary = "",startingBo...
  function freeNumbersNotF1 (line 377) | function freeNumbersNotF1() {
  function fetchTypeStaff (line 395) | function fetchTypeStaff(driverID) {
  function getParamsAutoContract (line 399) | function getParamsAutoContract(driverID,teamID,position,yearIteration = ...
  function fireDriver (line 495) | function fireDriver(driverID,teamID) {
  function removeFutureContract (line 511) | function removeFutureContract(driverID) {
  function rearrangeDriverEngineerPairings (line 515) | function rearrangeDriverEngineerPairings(teamID) {
  function swapDrivers (line 558) | function swapDrivers(driver1ID,driver2ID) {
  function editContract (line 704) | function editContract(driverID,salary,endSeason,startingBonus,raceBonus,...
  function futureContract (line 728) | function futureContract(teamID,driverID,salary,endSeason,startingBonus,r...
  function getExcelDate (line 779) | function getExcelDate(year) {
  function unretire (line 786) | function unretire(driverID) {
  function getTier (line 791) | function getTier(driverID) {
  function getDriverOverall (line 829) | function getDriverOverall(driverID) {
  function getDriverId (line 854) | function getDriverId(name) {
  function fixDriverStandings (line 874) | function fixDriverStandings() {

FILE: src/js/backend/scriptUtils/triggerUtils.js
  function manageDifficultyTriggers (line 59) | function manageDifficultyTriggers(triggerList) {
  function manageWeightTrigger (line 68) | function manageWeightTrigger(triggerLevel) {
  function manageDesignTimeTriggers (line 143) | function manageDesignTimeTriggers(triggerLevel) {
  function manageDesignBoostTriggers (line 151) | function manageDesignBoostTriggers(triggerLevel) {
  function manageInstantBuildTriggers (line 242) | function manageInstantBuildTriggers(triggerLevel) {
  function manageResearchTriggers (line 247) | function manageResearchTriggers(triggerLevel) {
  function upgradeFactories (line 281) | function upgradeFactories(triggerLevel) {
  function manageRefurbishTrigger (line 291) | function manageRefurbishTrigger(type) {
  function fetchExistingTriggers (line 309) | function fetchExistingTriggers() {
  function deleteProblematicTriggers (line 364) | function deleteProblematicTriggers() {
  function editFreezeMentality (line 380) | function editFreezeMentality(state) {
  function editFreezeDevelopment (line 432) | function editFreezeDevelopment(state) {

FILE: src/js/backend/worker.js
  method juniorTransfer (line 547) | juniorTransfer(data, postMessage) {

FILE: src/js/frontend/calendar.js
  function reubicate (line 17) | function reubicate(div0,div1,beforeAfter) {
  function addRace (line 35) | function addRace(race) {
  function updateVisualizers (line 254) | function updateVisualizers(){
  function load_calendar (line 264) | function load_calendar(races){
  function update_numbers (line 285) | function update_numbers(){
  function updateNumberDisplay (line 291) | function updateNumberDisplay(race, index) {
  function clearDropPreview (line 313) | function clearDropPreview() {
  function transformWeather (line 322) | function transformWeather(state){
  function changeFormat (line 350) | function changeFormat(div,format) {
  function load_addRaces (line 364) | function load_addRaces() {
  function listenerRaces (line 394) | function listenerRaces() {
  method start (line 447) | start(event) {
  method move (line 457) | move(event) {
  method end (line 491) | end(event) {

FILE: src/js/frontend/config.js
  function getUpdatedName (line 72) | function getUpdatedName(teamId) {
  function getCombinedDict (line 76) | function getCombinedDict() {
  constant CUSTOM_NEWS_TYPE_META (line 388) | const CUSTOM_NEWS_TYPE_META = {
  constant CUSTOM_NEWS_INVESTMENT_COUNTRIES (line 417) | const CUSTOM_NEWS_INVESTMENT_COUNTRIES = [
  constant CUSTOM_NEWS_DSQ_COMPONENTS (line 430) | const CUSTOM_NEWS_DSQ_COMPONENTS = [
  constant CUSTOM_NEWS_ENGINE_CHANGE_AREAS (line 446) | const CUSTOM_NEWS_ENGINE_CHANGE_AREAS = [
  constant CUSTOM_NEWS_ADUO_QUARTERS (line 463) | const CUSTOM_NEWS_ADUO_QUARTERS = [
  constant CUSTOM_NEWS_IMAGE_FILES (line 469) | const CUSTOM_NEWS_IMAGE_FILES = ['1_gar.webp', '1_media.webp', '1_pad.we...
  function getParamMap (line 471) | function getParamMap(data) {

FILE: src/js/frontend/devTools.js
  function createWindow (line 15) | function createWindow() {
  function openWindow (line 164) | function openWindow() {
  function closeWindow (line 170) | function closeWindow() {
  function toggleWindow (line 176) | function toggleWindow() {

FILE: src/js/frontend/dragFile.js
  function processSaveFile (line 67) | async function processSaveFile(file) {
  function updateStatusUI (line 151) | async function updateStatusUI(type, textConfig) {

FILE: src/js/frontend/head2head.js
  function formatSignedValue (line 45) | function formatSignedValue(value) {
  function getCompletedRaceIdsSet (line 52) | function getCompletedRaceIdsSet(data) {
  function renderTeamLogo (line 60) | function renderTeamLogo(container, teamId) {
  function setMidGrid (line 82) | function setMidGrid(value) {
  function setMaxRaces (line 86) | function setMaxRaces(value) {
  function setRelativeGrid (line 90) | function setRelativeGrid(value) {
  function init_colors_dict (line 100) | function init_colors_dict(theme = "default-theme") {
  function get_colors_dict (line 106) | function get_colors_dict() {
  function edit_colors_dict (line 110) | function edit_colors_dict(key, value) {
  function manage_h2h_bars (line 119) | function manage_h2h_bars(data) {
  function fill_bars (line 365) | function fill_bars(elem, d1_width, d2_width) {
  function toggle_sprints (line 387) | function toggle_sprints() {
  function toggle_racePace (line 430) | function toggle_racePace() {
  function toggle_qualiPace (line 517) | function toggle_qualiPace() {
  function sprintsListeners (line 601) | function sprintsListeners() {
  function racePaceListener (line 611) | function racePaceListener() {
  function qualiPaceListener (line 625) | function qualiPaceListener() {
  function increase_racePaceView (line 640) | function increase_racePaceView() {
  function decrease_racePaceView (line 649) | function decrease_racePaceView() {
  function increase_qualiPaceView (line 658) | function increase_qualiPaceView() {
  function decrease_qualiPaceView (line 667) | function decrease_qualiPaceView() {
  function change_sprintView (line 679) | function change_sprintView() {
  function hideComp (line 707) | function hideComp() {
  function queueAutoCompareDrivers (line 715) | function queueAutoCompareDrivers(driver1Id, driver2Id) {
  function applyQueuedAutoCompareDrivers (line 722) | function applyQueuedAutoCompareDrivers() {
  function load_drivers_h2h (line 754) | function load_drivers_h2h(drivers) {
  function buttonsListeners (line 923) | function buttonsListeners() {
  function resetH2H (line 997) | function resetH2H() {
  function nameTitleD1 (line 1087) | function nameTitleD1(aDriver1) {
  function nameTitleD2 (line 1115) | function nameTitleD2(aDriver2) {
  function H2HReady (line 1142) | function H2HReady() {
  function manageH2hState (line 1175) | function manageH2hState() {
  function load_labels_initialize_graphs (line 1204) | function load_labels_initialize_graphs(data) {
  function reload_h2h_graphs (line 1248) | function reload_h2h_graphs() {
  function load_teams_points_graph (line 1270) | function load_teams_points_graph(data) {
  function get_one_driver_points_format (line 1333) | function get_one_driver_points_format(driver, data) {
  function load_graphs_data (line 1371) | function load_graphs_data(drivers) {
  function findLastNonNaNIndex (line 1616) | function findLastNonNaNIndex(arr) {
  function updateMaxYAxis (line 1625) | function updateMaxYAxis(newMax) {
  function getNoEntryAnimationWithHoverTransition (line 1632) | function getNoEntryAnimationWithHoverTransition() {
  function createRaceChart (line 1652) | function createRaceChart(labelsArray, max) {
  function createQualiChart (line 1778) | function createQualiChart(labelsArray, max, q2_line) {
  function createPointsChart (line 1910) | function createPointsChart(labelsArray) {
  function createGapCharts (line 1990) | function createGapCharts(labelsArray, maxGapWinner, maxGapPole) {

FILE: src/js/frontend/news.js
  function isPaidNewsMember (line 52) | function isPaidNewsMember() {
  function canUseGenAiForNews (line 56) | function canUseGenAiForNews(news) {
  function setAduoLockedHidden (line 63) | function setAduoLockedHidden(el, hidden) {
  function applyNewsModalGenAiLocks (line 74) | function applyNewsModalGenAiLocks(news) {
  constant DEFAULT_NEWS_LANGUAGE (line 89) | const DEFAULT_NEWS_LANGUAGE = "English";
  constant NEWS_LANGUAGE_STORAGE_KEY (line 90) | const NEWS_LANGUAGE_STORAGE_KEY = "newsLanguage";
  constant NEWS_LANGUAGE_OPTIONS (line 91) | const NEWS_LANGUAGE_OPTIONS = [
  function finishGeneralLoader (line 124) | async function finishGeneralLoader() {
  function getNewsLanguage (line 156) | function getNewsLanguage() {
  function replaceLanguagePlaceholder (line 164) | function replaceLanguagePlaceholder(text, language) {
  function syncNewsLanguageDropdown (line 169) | function syncNewsLanguageDropdown(selectedLanguage) {
  function setNewsLanguage (line 188) | function setNewsLanguage(language) {
  function setupNewsLanguageDropdown (line 198) | function setupNewsLanguageDropdown() {
  function cleanupOpenedNewsItem (line 228) | async function cleanupOpenedNewsItem() {
  function exitArticleEditMode (line 259) | function exitArticleEditMode(opts = {}) {
  function hashStr (line 288) | function hashStr(str) {
  constant BUCKET_TURNING (line 297) | const BUCKET_TURNING = 5;
  constant BUCKET_NORMAL (line 298) | const BUCKET_NORMAL = 7;
  function openContextModal (line 300) | async function openContextModal(articleTitle = '') {
  function setOptionsContextOpen (line 353) | function setOptionsContextOpen(isOpen) {
  function openNewsModalFlow (line 368) | async function openNewsModalFlow(news, newsItem, newsList, opts = {}) {
  function addReadButtonListener (line 484) | function addReadButtonListener(readButton, newsItem, news, newsList) {
  function generateAndRenderArticle (line 490) | async function generateAndRenderArticle(news, newsList, label = "Generat...
  function manageTurningPointButtons (line 567) | function manageTurningPointButtons(news, newsList, maxDate, newsBody, re...
  function createNewsItemElement (line 775) | function createNewsItemElement(news, index, newsAvailable, newsList, max...
  function computeStableKey (line 932) | function computeStableKey(n) {
  function place_news (line 939) | async function place_news(newsAndTurningPoints, newsAvailable) {
  function place_turning_outcome (line 1003) | async function place_turning_outcome(turningPointResponse, newsList) {
  function imageExists (line 1074) | async function imageExists(url) {
  function prependAnimated (line 1083) | function prependAnimated(container, newEl, duration = 250, easing = 'eas...
  function getTurningPointEvents (line 1158) | async function getTurningPointEvents(date) {
  function buildContextData (line 1239) | function buildContextData(data, config = {}) {
  function buildContextualPrompt (line 1334) | function buildContextualPrompt(data, config = {}) {
  constant ADUO_ENGINE_STAT_LABELS (line 1465) | const ADUO_ENGINE_STAT_LABELS = {
  constant ADUO_ENGINE_STAT_ORDER (line 1473) | const ADUO_ENGINE_STAT_ORDER = [10, 6, 14, 18, 19];
  function describeAduoChange (line 1475) | function describeAduoChange(pct) {
  function buildAduoTemplateArticle (line 1492) | function buildAduoTemplateArticle(newData) {
  function manageRead (line 1522) | async function manageRead(newData, newsList, barProgressDiv, interval, o...
  function cleanArticleOutput (line 1715) | function cleanArticleOutput(rawMd) {
  function safeJsonParse (line 1724) | function safeJsonParse(raw) {
  function tryParseJsonObject (line 1732) | function tryParseJsonObject(raw) {
  function removeLeading (line 1761) | function removeLeading(md) {
  function italicizeQuotes (line 1765) | function italicizeQuotes(md) {
  function contextualizeCustomNews (line 1776) | async function contextualizeCustomNews(newData) {
  function contextualizeTurningPointInjury (line 1813) | async function contextualizeTurningPointInjury(newData, turningPointType) {
  function contextualizeTurningPointRaceSubstitution (line 1888) | async function contextualizeTurningPointRaceSubstitution(newData, turnin...
  function contextualizeTurningPointInvestment (line 1925) | async function contextualizeTurningPointInvestment(newData, turningPoint...
  function contextualizeDSQ (line 1964) | async function contextualizeDSQ(newData, type) {
  function contextualizeTurningPointTechnicalDirective (line 2012) | async function contextualizeTurningPointTechnicalDirective(newData, turn...
  function contextualizeTurningPointEngineRegulation (line 2064) | async function contextualizeTurningPointEngineRegulation(newData, turnin...
  function contextualizeTurningPointAduo (line 2119) | async function contextualizeTurningPointAduo(newData, turningPointType) {
  function contextualizeTurningPointYoungDrivers (line 2227) | async function contextualizeTurningPointYoungDrivers(newData, turningPoi...
  function contextualizeTurningPointTransfer (line 2295) | async function contextualizeTurningPointTransfer(newData, turningPointTy...
  function contextualizeWorldChampion (line 2377) | async function contextualizeWorldChampion(newData) {
  function contextualizePotentialChampion (line 2424) | async function contextualizePotentialChampion(newData) {
  function contextualizeSillySeasonTransferNews (line 2517) | async function contextualizeSillySeasonTransferNews(newData) {
  function contextualizeFakeTransferNews (line 2546) | async function contextualizeFakeTransferNews(newData) {
  function contextualizeNextSeasonGrid (line 2593) | async function contextualizeNextSeasonGrid(newData) {
  function contextualizeBigTransferConfirm (line 2644) | async function contextualizeBigTransferConfirm(newData) {
  function contextualizeRenewalNews (line 2709) | async function contextualizeRenewalNews(newData) {
  function contextualizeTeamComparison (line 2753) | async function contextualizeTeamComparison(newData) {
  function contextualizeQualiResults (line 2820) | async function contextualizeQualiResults(newData) {
  function contextualizeRaceResults (line 2891) | async function contextualizeRaceResults(newData) {
  function contextualizeDriverComparison (line 2961) | async function contextualizeDriverComparison(newData) {
  function contextualizeRaceReaction (line 2992) | async function contextualizeRaceReaction(newData) {
  function contextualizeFeederSeriesReview (line 3063) | async function contextualizeFeederSeriesReview(newData) {
  function contextualizeSeasonReview (line 3106) | async function contextualizeSeasonReview(newData) {
  function askGenAI (line 3162) | async function askGenAI(messages, opts = {}) {
  function createEditFooterButtons (line 3230) | function createEditFooterButtons(articleEl) {
  function startArticleEditMode (line 3295) | function startArticleEditMode() {
  function buildEmergencyOverlay (line 3348) | function buildEmergencyOverlay() {
  function ensureEmergencyOverlay (line 3370) | function ensureEmergencyOverlay(imageContainer) {
  function manage_overlay (line 3376) | function manage_overlay(imageContainer, overlay, data, image) {
  function getOrdinalSuffix (line 3722) | function getOrdinalSuffix(n) {
  constant CUSTOM_NEWS_TYPE_DEFS (line 3767) | const CUSTOM_NEWS_TYPE_DEFS = Object.entries(CUSTOM_NEWS_TYPE_META).map(...
  function setCustomNewsError (line 3776) | function setCustomNewsError(msg) {
  function getCustomNewsTitlePlaceholder (line 3787) | function getCustomNewsTitlePlaceholder(type = getCustomNewsSelectedType(...
  function getCustomNewsImageSrc (line 3791) | function getCustomNewsImageSrc(imageFile) {
  function toIsoDate (line 3795) | function toIsoDate(date) {
  function setRedesignedDropdownOpen (line 3800) | function setRedesignedDropdownOpen(dropdown, isOpen) {
  function bindRedesignedDropdownToggle (line 3806) | function bindRedesignedDropdownToggle(dropdown) {
  function getDropdownLabelSpan (line 3824) | function getDropdownLabelSpan(buttonEl) {
  function setRedesignedDropdownSelection (line 3828) | function setRedesignedDropdownSelection(buttonEl, menuEl, value, label) {
  function getRedesignedDropdownValue (line 3843) | function getRedesignedDropdownValue(buttonEl) {
  function getCustomNewsSelectedType (line 3848) | function getCustomNewsSelectedType() {
  function populateCustomNewsTypeDropdown (line 3852) | function populateCustomNewsTypeDropdown({
  function populateRedesignedDropdown (line 3918) | function populateRedesignedDropdown({
  function resolveCustomNewsTitleType (line 4015) | function resolveCustomNewsTitleType(type = getCustomNewsSelectedType()) {
  function getCustomNewsTitleTemplates (line 4025) | function getCustomNewsTitleTemplates(type = getCustomNewsSelectedType()) {
  function refreshCustomNewsTitleTemplates (line 4039) | function refreshCustomNewsTitleTemplates() {
  function updateCustomNewsImagePreview (line 4074) | function updateCustomNewsImagePreview() {
  function bindCustomNewsLiveRefresh (line 4081) | function bindCustomNewsLiveRefresh() {
  function loadCustomNewsOptions (line 4099) | async function loadCustomNewsOptions() {
  function renderCustomNewsParams (line 4106) | function renderCustomNewsParams(type, options) {
  function openCustomNewsModal (line 5529) | async function openCustomNewsModal() {
  function submitCustomNews (line 5573) | async function submitCustomNews() {
  function updateNewsYearsButton (line 5795) | function updateNewsYearsButton(message) {
  function addTurningPointContexts (line 5826) | async function addTurningPointContexts(prompt, date) {

FILE: src/js/frontend/performance.js
  function clampPercent (line 55) | function clampPercent(value) {
  function setBarWidth (line 63) | function setBarWidth(bar, value) {
  function normalizeData (line 68) | function normalizeData(data) {
  function readPartsStatsFromDom (line 87) | function readPartsStatsFromDom() {
  function applyPartsStatsToDom (line 104) | function applyPartsStatsToDom(data) {
  function updateExpertiseModeUi (line 118) | function updateExpertiseModeUi() {
  function setPerformanceDetailsMode (line 159) | function setPerformanceDetailsMode(mode) {
  function updatePerformanceExpertiseButton (line 182) | function updatePerformanceExpertiseButton() {
  function load_performance (line 202) | function load_performance(teams) {
  function load_cars (line 220) | function load_cars(data) {
  function load_attributes (line 259) | function load_attributes(teams) {
  function load_car_attributes (line 271) | function load_car_attributes(teams) {
  function order_by (line 284) | function order_by(criterion) {
  function updateTeamsCarsButton (line 322) | function updateTeamsCarsButton() {
  function gather_engines_data (line 389) | function gather_engines_data() {
  function update_max_design (line 407) | function update_max_design(data) {
  function manage_engineStats (line 415) | function manage_engineStats(engineData) {
  function removeSelected (line 442) | function removeSelected() {
  function load_parts_stats (line 495) | function load_parts_stats(data) {
  function load_team_expertise (line 506) | function load_team_expertise(data) {
  function gather_team_expertise_data (line 519) | function gather_team_expertise_data() {
  function load_parts_list (line 537) | function load_parts_list(data) {
  function add_new_part_button (line 628) | function add_new_part_button(list) {
  function add_n_parts_buttons (line 682) | function add_n_parts_buttons(loadoutContainer) {
  function load_one_part (line 728) | function load_one_part(data) {
  function add_partName_listener (line 743) | function add_partName_listener(div, subtitle, type = "old") {
  function loadout_listener (line 767) | function loadout_listener(icon, loadout_n, partTitle) {
  function buildHoldOptions (line 830) | function buildHoldOptions(input, extra = {}) {
  function setPerformanceView (line 941) | function setPerformanceView(view) {
  function createOverviewCard (line 983) | function createOverviewCard(attributeConfig) {
  function load_overview (line 1081) | function load_overview() {
  function resetBarsEngines (line 1148) | function resetBarsEngines(div) {
  function resetBars (line 1162) | function resetBars() {
  function add_custom_engine (line 1169) | function add_custom_engine(name, stats) {
  function wireEngineStatButtons (line 1258) | function wireEngineStatButtons(container) {
  function createCustomEngineCard (line 1281) | function createCustomEngineCard(engineId, name, stats) {
  function renderCustomEnginesInList (line 1400) | function renderCustomEnginesInList(engines) {
  function getNextCustomEngineId (line 1416) | function getNextCustomEngineId() {
  function gather_custom_engines_data (line 1441) | function gather_custom_engines_data() {
  function load_custom_engines (line 1462) | function load_custom_engines(data) {
  function manage_bar (line 1498) | function manage_bar(bar, progress) {
  function reload_performance_graph (line 1532) | function reload_performance_graph() {
  function load_performance_graph (line 1540) | function load_performance_graph(data) {
  function applyAduoUpgradeAnnotations (line 1597) | function applyAduoUpgradeAnnotations(raceIds, races, labelCount) {
  function createPerformanceChart (line 1640) | function createPerformanceChart(labelsArray) {

FILE: src/js/frontend/recentsManager.js
  constant DB_NAME (line 3) | const DB_NAME = "SaveEditorDB";
  constant STORE_NAME (line 4) | const STORE_NAME = "recentFileHandles";
  constant DB_VERSION (line 5) | const DB_VERSION = 1;
  function openDB (line 7) | function openDB() {
  function saveHandleToRecents (line 22) | async function saveHandleToRecents(handle) {
  function getRecentHandles (line 36) | async function getRecentHandles() {
  function removeRecentHandle (line 40) | async function removeRecentHandle(name) {

FILE: src/js/frontend/regulations.js
  function getEnumChange (line 27) | function getEnumChange(id) {
  function parseIntSafe (line 31) | function parseIntSafe(val, fallback = 0) {
  function formatMoney (line 36) | function formatMoney(val) {
  function getSchemeName (line 41) | function getSchemeName(id) {
  function getPackageName (line 49) | function getPackageName(id) {
  function getSelectedPointScheme (line 53) | function getSelectedPointScheme() {
  function getSelectedResourcePackage (line 59) | function getSelectedResourcePackage() {
  function setDropdownLabel (line 65) | function setDropdownLabel(btn, label) {
  function updateMenus (line 70) | function updateMenus() {
  function renderPointSchemeTable (line 135) | function renderPointSchemeTable() {
  function renderResourcePackageTable (line 169) | function renderResourcePackageTable() {
  function initHoldControlsOnce (line 218) | function initHoldControlsOnce() {
  function createNewPointScheme (line 259) | function createNewPointScheme() {
  function createNewResourcePackage (line 275) | function createNewResourcePackage() {
  function load_regulations (line 292) | function load_regulations(data) {
  function gather_regulations_data (line 333) | function gather_regulations_data() {

FILE: src/js/frontend/renderer.js
  function updateTurningPointsFrequencyUI (line 127) | function updateTurningPointsFrequencyUI() {
  function setSaveName (line 237) | function setSaveName(name) {
  function getSaveName (line 241) | function getSaveName() {
  function setIsShowingNotification (line 245) | function setIsShowingNotification(value) {
  function getPatchNotes (line 254) | async function getPatchNotes() {
  function handleLogout (line 360) | async function handleLogout() {
  function getUserTier (line 380) | async function getUserTier() {
  function validateSession (line 403) | async function validateSession() {
  function maybeReloadForNightlyAccess (line 457) | function maybeReloadForNightlyAccess(tierInfo) {
  function updatePatreonUI (line 467) | function updatePatreonUI(tier) {
  function editModeHandler (line 522) | function editModeHandler() {
  function calendarModeHandler (line 627) | function calendarModeHandler() {
  function regulationsModeHandler (line 652) | function regulationsModeHandler() {
  function teamsModeHandler (line 662) | function teamsModeHandler() {
  function performanceModeHandler (line 691) | function performanceModeHandler() {
  function first_show_animation (line 763) | function first_show_animation() {
  function manageSaveButton (line 776) | function manageSaveButton(show, mode, customHandler) {
  function updateFront (line 816) | async function updateFront(data) {
  function new_update_notifications (line 836) | function new_update_notifications(message, type = "success") {
  function showNextNotification (line 841) | function showNextNotification(type) {
  function make_name_prettier (line 875) | function make_name_prettier(text) {
  function orderTeamTemplatesByStandings (line 887) | function orderTeamTemplatesByStandings(standingsRows) {
  function removeLegacyKeys (line 1123) | function removeLegacyKeys(base) {
  function migrateLegacyNewsOnce (line 1135) | async function migrateLegacyNewsOnce() {
  function generateNews (line 1252) | async function generateNews() {
  function startGeneralNewsProgress (line 1292) | function startGeneralNewsProgress(progressDiv) {
  function update_engine_allocations (line 1308) | function update_engine_allocations(message) {
  function resizeWindowToHeight (line 1334) | function resizeWindowToHeight(mode) {
  function manage_game_year (line 1369) | function manage_game_year(info) {
  function manage_custom_team (line 1413) | function manage_custom_team(nameColor) {
  function replace_custom_team_color (line 1464) | function replace_custom_team_color(primary, secondary) {
  function replace_custom_team_logo (line 1497) | function replace_custom_team_logo(path) {
  function manage_config (line 1524) | function manage_config(info, year_config = false) {
  function replace_all_teams (line 1530) | function replace_all_teams(info) {
  function manage_config_content (line 1559) | function manage_config_content(info, year_config = false) {
  function setRenaultEnginePresentation (line 1614) | function setRenaultEnginePresentation(engineMode) {
  function updateJenzerToDams (line 1656) | function updateJenzerToDams(mode = "dams") {
  function update_difficulty_info (line 1682) | function update_difficulty_info(triggerList) {
  function change_css_variables (line 1708) | function change_css_variables(oldVar, newVar) {
  function replace_modal_teams (line 1721) | function replace_modal_teams(version) {
  function applyConfigFromEditorUI (line 1748) | function applyConfigFromEditorUI(overrides = {}) {
  function askFixDoublePointsBug (line 1867) | async function askFixDoublePointsBug(message){
  function setDownloadSaveProgress (line 1896) | function setDownloadSaveProgress(percent) {
  function clearDownloadSaveWorkerHandler (line 1902) | function clearDownloadSaveWorkerHandler() {
  function clearDownloadSaveProgressTimers (line 1908) | function clearDownloadSaveProgressTimers() {
  function resetDownloadSaveProgress (line 1919) | function resetDownloadSaveProgress() {
  function startDownloadSaveProgressSimulation (line 1928) | function startDownloadSaveProgressSimulation() {
  function finishDownloadSaveProgress (line 1961) | function finishDownloadSaveProgress() {
  function downloadExportedSave (line 1979) | function downloadExportedSave(command) {
  function check_selected (line 2038) | function check_selected() {
  function update_mentality_span (line 2164) | function update_mentality_span(value) {
  function update_refurbish_span (line 2180) | function update_refurbish_span(value) {
  function update_development_span (line 2196) | function update_development_span(value) {
  function manage_difficulty_warnings (line 2207) | function manage_difficulty_warnings(level, triggerList) {
  function load_difficulty_warnings (line 2235) | function load_difficulty_warnings(triggerList) {
  function manageScripts (line 2304) | function manageScripts(...divs) {
  function manageNewsStatus (line 2361) | function manageNewsStatus(patreonTier) {
  function checkGenerableNews (line 2376) | function checkGenerableNews(patreonTier) {
  function checkOpenSlideUp (line 2395) | async function checkOpenSlideUp() {
  function showPatreonModal (line 2412) | function showPatreonModal() {
  function canShowPatreonModal (line 2425) | function canShowPatreonModal(lastShown) {
  function animateTextLoop (line 2533) | async function animateTextLoop() {
  function updateRateLimitsDisplay (line 2572) | async function updateRateLimitsDisplay() {
  constant MS_PER_DAY (line 2623) | const MS_PER_DAY = 24 * 60 * 60 * 1000;
  function getRecentsTimeLabel (line 2625) | function getRecentsTimeLabel(openedDate, now = new Date()) {
  function populateRecentHandles (line 2640) | function populateRecentHandles(recents) {
  function verifyPermission (line 2704) | async function verifyPermission(fileHandle) {
  function createMarqueeItem (line 2718) | function createMarqueeItem(name, tier) {
  function updateToolbarThemeLogo (line 2725) | function updateToolbarThemeLogo() {
  function syncNightlyIndicator (line 2752) | function syncNightlyIndicator() {
  function syncNightlyThemeVisibility (line 2771) | function syncNightlyThemeVisibility() {
  function changeTheme (line 2799) | function changeTheme() {
  function loadTheme (line 2810) | function loadTheme() {
  function shouldShowPatchModal (line 2930) | function shouldShowPatchModal(storedVersion, versionNow) {
  function confirmModal (line 2951) | async function confirmModal({
  function attachHold (line 3033) | function attachHold(btn, el, step = 1, opts = {}) {

FILE: src/js/frontend/seasonMods.js
  function normalizeToggleEnabled (line 8) | function normalizeToggleEnabled(value) {
  function clearMods2026Illumination (line 12) | function clearMods2026Illumination() {
  function seasonModsIsVisible (line 22) | function seasonModsIsVisible() {
  function scheduleMods2026Illumination (line 28) | function scheduleMods2026Illumination() {
  function setAduoTpTogglesChecked (line 46) | function setAduoTpTogglesChecked(enabled) {
  function updateAduoTpEnabled (line 54) | function updateAduoTpEnabled(enabled) {
  function getCustomTeamName (line 61) | function getCustomTeamName() {
  function shouldAutoApplyCadillacLogo (line 66) | function shouldAutoApplyCadillacLogo() {
  function getCadillacLogoDataUrl (line 73) | function getCadillacLogoDataUrl() {
  function tryApplyCadillacCustomLogo (line 89) | function tryApplyCadillacCustomLogo() {
  function prefersReducedMotion (line 98) | function prefersReducedMotion() {
  function animatePointsValue (line 102) | function animatePointsValue(element, targetValue, durationMs = 1000) {
  function setModsSeason (line 134) | function setModsSeason(seasonYear) {
  function initModsSeasonPills (line 152) | function initModsSeasonPills() {
  function initMods2026Actions (line 174) | function initMods2026Actions(){
  function initMods2025Actions (line 382) | function initMods2025Actions() {
  function initSeasonMods (line 495) | function initSeasonMods() {
  function syncAduoTpToggles (line 535) | function syncAduoTpToggles(enabledRaw) {
  function syncMods2026ApplyAllButtonState (line 541) | function syncMods2026ApplyAllButtonState() {
  function syncMods2025Dependencies (line 561) | function syncMods2025Dependencies() {
  function syncMods2026Dependencies (line 583) | function syncMods2026Dependencies() {
  function updateMod2026Blocking (line 605) | function updateMod2026Blocking(data) {
  function updateMod2025Blocking (line 648) | function updateMod2025Blocking(data) {

FILE: src/js/frontend/seasonViewer.js
  function ensureDropdownCheckIcons (line 49) | function ensureDropdownCheckIcons(menuEl) {
  function syncDropdownCheckIcons (line 61) | function syncDropdownCheckIcons(menuEl, isSelected) {
  function syncTableTypeDropdownChecks (line 70) | function syncTableTypeDropdownChecks() {
  function syncSeriesTypeDropdownChecks (line 75) | function syncSeriesTypeDropdownChecks() {
  function syncRecordsTypeDropdownChecks (line 81) | function syncRecordsTypeDropdownChecks() {
  function syncYearDropdownChecks (line 87) | function syncYearDropdownChecks() {
  function applyStandingsDetailsState (line 93) | function applyStandingsDetailsState() {
  function setStandingsPositionChange (line 114) | function setStandingsPositionChange(changeDiv, lastPositionChange) {
  function setStandingsPointsGap (line 145) | function setStandingsPointsGap(gapDiv, gapToLeader) {
  function updateStandingsPointsGaps (line 151) | function updateStandingsPointsGaps(rows, leaderPoints) {
  function addEngineName (line 172) | function addEngineName(id, name) {
  function deleteEngineName (line 176) | function deleteEngineName(id) {
  function setEngineAllocations (line 180) | function setEngineAllocations(allocations) {
  function getEngineLogoSrc (line 184) | function getEngineLogoSrc(name) {
  function emojiToDataUri (line 201) | function emojiToDataUri(emoji) {
  function resetViewer (line 218) | function resetViewer() {
  function resetYearButtons (line 228) | function resetYearButtons() {
  function manageDriversTeamsModeChanged (line 252) | function manageDriversTeamsModeChanged() {
  function updateAllTimeVisibilityForTeamsRecords (line 266) | function updateAllTimeVisibilityForTeamsRecords() {
  function updateTopPanelControlsVisibility (line 275) | function updateTopPanelControlsVisibility() {
  function manage_show_tables (line 322) | function manage_show_tables() {
  function forceStandingsCurrentSeason (line 361) | function forceStandingsCurrentSeason() {
  function updateSeriesControls (line 384) | function updateSeriesControls() {
  function change_points_pos_drivers (line 417) | function change_points_pos_drivers() {
  function renderTeamCellList (line 428) | function renderTeamCellList(cell, values) {
  function change_points_pos_teams (line 445) | function change_points_pos_teams() {
  function getTeamAbbr (line 469) | function getTeamAbbr(teamId) {
  function buildTeamAbbrElement (line 474) | function buildTeamAbbrElement(teamId, sizeClass) {
  function createHeaderCell (line 496) | function createHeaderCell(trackId, labelSuffix = "", baseClass = "driver...
  function formatDriverCellValue (line 516) | function formatDriverCellValue(value, type) {
  function syncFormulaFromCalendar (line 523) | function syncFormulaFromCalendar(formula) {
  function new_drivers_table (line 536) | function new_drivers_table(data) {
  function new_teams_table (line 586) | function new_teams_table(data) {
  function checkscroll (line 634) | function checkscroll() {
  function new_color_drivers_table (line 645) | function new_color_drivers_table() {
  function manage_teams_table_logos (line 683) | function manage_teams_table_logos() {
  function manage_teams_table_names (line 845) | function manage_teams_table_names() {
  function new_color_teams_table (line 921) | function new_color_teams_table() {
  function order_teams_table (line 974) | function order_teams_table() {
  function new_load_drivers_table (line 989) | function new_load_drivers_table(data) {
  function checkIfDriverIsChampion (line 1029) | function checkIfDriverIsChampion(driver1, driver1Points, driver2Points, ...
  function new_order_drivers (line 1087) | function new_order_drivers(array) {
  function update_logo (line 1091) | function update_logo(team, logo, newTeam) {
  function reloadTables (line 1122) | function reloadTables() {
  function new_load_teams_table (line 1133) | function new_load_teams_table(data) {
  function checkIfTeamIsChamp (line 1247) | function checkIfTeamIsChamp(team1Points, team2Points, pointsInfo, teamRo...
  function new_addTeam (line 1316) | function new_addTeam(teamRaceMap, name, pos, id, lastPositionChange = 0) {
  function buildF1DriverLogoElement (line 1672) | function buildF1DriverLogoElement(teamId) {
  function buildDriverLogoDiv (line 1753) | function buildDriverLogoDiv(teamId, opts = {}) {
  function new_addDriver (line 1778) | function new_addDriver(driver, races_done, odd) {
  function manage_dataset_info_driver (line 1943) | function manage_dataset_info_driver(info, sprintInfo, type) {
  function manage_dataset_info_team (line 1994) | function manage_dataset_info_team(info, sprintInfo, type) {
  function manageText (line 2047) | function manageText(raceDiv) {
  function manageTeamsText (line 2108) | function manageTeamsText(raceDiv) {
  function generateYearsMenu (line 2191) | function generateYearsMenu(actualYear) {
  function manageRecordsSelected (line 2246) | function manageRecordsSelected(forcedYearEl = null) {
  function manageSeasonReview (line 2301) | function manageSeasonReview(){
  function populateSeasonReview (line 2329) | function populateSeasonReview(data) {
  function updateRoundsCounterSeasonReview (line 2351) | function updateRoundsCounterSeasonReview(events) {
  function populateComparisonsSeasonReview (line 2363) | function populateComparisonsSeasonReview(comparisons, teamsStandings) {
  function populateDriversStandingsSeasonReview (line 2500) | function populateDriversStandingsSeasonReview(data, meta = {}) {
  function updateDriversStandingsMaxHeight (line 2589) | function updateDriversStandingsMaxHeight() {
  function ensureDriversStandingsHeightListener (line 2609) | function ensureDriversStandingsHeightListener() {
  function updateTeamsStandingsMaxHeight (line 2623) | function updateTeamsStandingsMaxHeight() {
  function ensureTeamsStandingsHeightListener (line 2643) | function ensureTeamsStandingsHeightListener() {
  function updateComparisonsMaxHeight (line 2657) | function updateComparisonsMaxHeight() {
  function ensureComparisonsHeightListener (line 2679) | function ensureComparisonsHeightListener() {
  function populateTeamsStandingsSeasonReview (line 2693) | function populateTeamsStandingsSeasonReview(data, meta = {}) {
  function populateQualifyingAnalysisSeasonReview (line 2783) | function populateQualifyingAnalysisSeasonReview(data) {
  function updateQualifyingListsMaxHeight (line 2857) | function updateQualifyingListsMaxHeight() {
  function ensureQualifyingListsHeightListener (line 2878) | function ensureQualifyingListsHeightListener() {
  function populateWinsDriversSeasonReview (line 2892) | function populateWinsDriversSeasonReview(data) {
  function updateWinsDriversListMaxHeight (line 2946) | function updateWinsDriversListMaxHeight() {
  function ensureWinsDriversListHeightListener (line 2964) | function ensureWinsDriversListHeightListener() {
  function formatTeamNameForDisplay (line 2978) | function formatTeamNameForDisplay(teamName, { upper = false } = {}) {
  function addSeasonReviewPhantomRows (line 2985) | function addSeasonReviewPhantomRows(container, targetCount = 4) {
  function populateTeamsAggregateSeasonReview (line 2995) | function populateTeamsAggregateSeasonReview(driverRecords, containerSele...
  function populateDriverOfTheDaySeasonReview (line 3052) | function populateDriverOfTheDaySeasonReview(data) {
  function computeTeamTotalsFromDriverRecords (line 3111) | function computeTeamTotalsFromDriverRecords(driverRecords) {
  function populateWinsTeamsSeasonReview (line 3127) | function populateWinsTeamsSeasonReview(winsRecords) {
  function populatePodiumsTeamsSeasonReview (line 3167) | function populatePodiumsTeamsSeasonReview(podiumsRecords) {
  function populatePodiumsDriversSeasonReview (line 3210) | function populatePodiumsDriversSeasonReview(podiumsRecords) {
  function manageShowRecords (line 3333) | function manageShowRecords() {
  function showSessionResultsTable (line 3349) | function showSessionResultsTable() {
  function getSessionResultsQualiGridPosition (line 3365) | function getSessionResultsQualiGridPosition(row) {
  function onSessionResultsFetched (line 3375) | function onSessionResultsFetched(data) {
  function getDragAfterSessionResultsRow (line 3929) | function getDragAfterSessionResultsRow(container, y) {
  function reindexRaceEditPositions (line 3941) | function reindexRaceEditPositions(container) {
  function parseSessionResultsTimeToSeconds (line 3955) | function parseSessionResultsTimeToSeconds(txt) {
  function saveSessionResultsRaceEdits (line 3975) | async function saveSessionResultsRaceEdits() {
  function ensureSessionResultsPointsInfo (line 4023) | async function ensureSessionResultsPointsInfo() {
  function updateRaceEditPoints (line 4041) | function updateRaceEditPoints() {
  function setupSessionResultsEditToggle (line 4118) | function setupSessionResultsEditToggle() {
  function setupSessionResultsCompactToggle (line 4135) | function setupSessionResultsCompactToggle() {
  function safeJsonDownload (line 4148) | function safeJsonDownload(filename, jsonObj) {
  function slugifyForFilename (line 4168) | function slugifyForFilename(txt) {
  function slugifyForUniqueName (line 4177) | function slugifyForUniqueName(txt) {
  function normalizeRltoolsDriverName (line 4182) | function normalizeRltoolsDriverName(name) {
  function getRltoolsTrackUniqueName (line 4186) | function getRltoolsTrackUniqueName(trackId, year) {
  function getQualifyingStageNumber (line 4194) | function getQualifyingStageNumber(qualifyingStage) {
  function getSessionPositionForExport (line 4198) | function getSessionPositionForExport(sessionKeyLower, weekendType, quali...
  function getRltoolsSessionType (line 4228) | function getRltoolsSessionType(sessionKeyLower) {
  function getRltoolsSessionFilenamePart (line 4235) | function getRltoolsSessionFilenamePart(sessionKeyLower) {
  function getRltoolsQualifyingStageConfigs (line 4246) | function getRltoolsQualifyingStageConfigs() {
  function secondsToIntMs (line 4254) | function secondsToIntMs(v) {
  function getShownSessionResultsRowsForExport (line 4260) | function getShownSessionResultsRowsForExport() {
  function buildRltoolsExportObject (line 4307) | function buildRltoolsExportObject(options = {}) {
  function exportShownSessionResultsToRltools (line 4450) | function exportShownSessionResultsToRltools() {
  function setupSessionResultsExportRltoolsButton (line 4498) | function setupSessionResultsExportRltoolsButton() {
  function formatLapTime (line 4527) | function formatLapTime(lapTimeMs) {
  function formatGapTime (line 4543) | function formatGapTime(lapTimeMs) {
  function getGpDisplayName (line 4561) | function getGpDisplayName(trackId) {
  function getSessionOptionsForWeekend (line 4566) | function getSessionOptionsForWeekend(weekendType) {
  function getLatestYearFromMenu (line 4586) | function getLatestYearFromMenu() {
  function openSessionResultsForRace (line 4597) | function openSessionResultsForRace(year, raceId, sessionKey) {
  function ensureSessionResultsMenuPopulated (line 4609) | async function ensureSessionResultsMenuPopulated() {
  function populateAndShowSessionResultsSessionMenu (line 4718) | function populateAndShowSessionResultsSessionMenu(opts = {}) {
  function setYearButton (line 4758) | function setYearButton(el) {
  function loadRecordsList (line 4765) | function loadRecordsList(data) {
  function loadTeamRecordsList (line 4967) | function loadTeamRecordsList(payload) {

FILE: src/js/frontend/stats.js
  function setAttributesTitle (line 51) | function setAttributesTitle(typeStaff) {
  function initNationalityDropdown (line 59) | function initNationalityDropdown() {
  function setStatPanelShown (line 106) | function setStatPanelShown(value) {
  function setTypeOverall (line 110) | function setTypeOverall(value) {
  function setTypeEdit (line 114) | function setTypeEdit(value) {
  function removeStatsDrivers (line 121) | function removeStatsDrivers(staffOnly = false) {
  function place_drivers_editStats (line 136) | function place_drivers_editStats(driversArray) {
  function initStatsDrivers (line 250) | function initStatsDrivers() {
  function place_staff_editStats (line 264) | function place_staff_editStats(staffArray) {
  function getMentalityModifier (line 386) | function getMentalityModifier(mentality) {
  function recalculateOverall (line 397) | function recalculateOverall() {
  function getName (line 432) | function getName(html) {
  function calculateOverall (line 450) | function calculateOverall(stats, type) {
  function updateStat (line 476) | function updateStat(input, increment) {
  function listenersStaffGroups (line 716) | function listenersStaffGroups() {
  function setAddStaffType (line 776) | function setAddStaffType(typeStaff) {
  function resetStatsFilters (line 785) | function resetStatsFilters() {
  function applyStaffTypeSelection (line 804) | function applyStaffTypeSelection(typeStaff) {
  function getDraftContainer (line 808) | function getDraftContainer() {
  function getCurrentDraftElement (line 812) | function getCurrentDraftElement() {
  function removeCurrentDraftElement (line 816) | function removeCurrentDraftElement() {
  function createDraftElement (line 824) | function createDraftElement(profile) {
  function updateDraftControlVisibility (line 875) | function updateDraftControlVisibility(div) {
  function enterNameEditMode (line 891) | function enterNameEditMode() {
  function isDraftProfileSelected (line 898) | function isDraftProfileSelected() {
  function setEditorStaffType (line 902) | function setEditorStaffType(typeStaff) {
  function loadRandomStaffDraft (line 933) | function loadRandomStaffDraft(profile) {
  function applyDraftForenameUpdate (line 962) | function applyDraftForenameUpdate(payload) {
  function applyDraftCountryLocale (line 997) | function applyDraftCountryLocale(payload) {
  function manage_order (line 1007) | function manage_order(state) {
  function manage_stat_bar (line 1057) | function manage_stat_bar(element, value) {
  function load_stats (line 1069) | function load_stats(div) {
  function loadNumbers (line 1255) | function loadNumbers(nums) {
  function capitalizeFirstLetter (line 1339) | function capitalizeFirstLetter(str) {
  function manage_stats_title (line 1350) | function manage_stats_title(html) {
  function change_elegibles (line 1369) | function change_elegibles(divID) {
  function cssVar (line 1390) | function cssVar(name, fallback) {
  function ensureStatsGraphCanvas (line 1396) | function ensureStatsGraphCanvas() {
  function getThemeColor (line 1408) | function getThemeColor(fallback = '#4DA3FF') {
  function rgbaFromHex (line 1417) | function rgbaFromHex(hex, alpha) {
  function createStatsRadarChart (line 1427) | function createStatsRadarChart(labels) {
  function removeDatasetFromStatsRadarData (line 1521) | function removeDatasetFromStatsRadarData(index) {
  function updateStatsRadarData (line 1529) | function updateStatsRadarData(values, index = 0, color, name) {
  function addDatasetToStatsRadarData (line 1543) | function addDatasetToStatsRadarData(values, color, name) {
  function recalculateRadarScale (line 1559) | function recalculateRadarScale() {
  function toggleComparisonMode (line 1578) | function toggleComparisonMode() {
  function resetComparisonUI (line 1656) | function resetComparisonUI() {
  function updateComparisonUI (line 1736) | function updateComparisonUI() {

FILE: src/js/frontend/teamReplacements.js
  function updateTeamMenuClass (line 38) | function updateTeamMenuClass(selector, info) {
  function updateTeamColors (line 49) | function updateTeamColors({
  function replaceTeam (line 95) | function replaceTeam(config, info, deps) {
  function createTeamReplacers (line 119) | function createTeamReplacers(deps) {

FILE: src/js/frontend/teams.js
  constant MAX_ARC_LENGTH (line 11) | const MAX_ARC_LENGTH = 212;
  function addContinuousListener (line 49) | function addContinuousListener(element, selector, incrementCallback, dec...
  function updateGaugeVisual (line 155) | function updateGaugeVisual(container, value) {
  function fillLevels (line 172) | function fillLevels(teamData) {
  function resetTeamEditing (line 251) | function resetTeamEditing() {
  function updatePitStat (line 258) | function updatePitStat(input, increment) {
  function manageConfidence (line 302) | function manageConfidence(data) {
  function gather_team_data (line 354) | function gather_team_data() {
  function gather_pit_crew (line 371) | function gather_pit_crew() {

FILE: src/js/frontend/transfers.js
  function setCurrentSeason (line 58) | function setCurrentSeason(season) {
  function remove_drivers (line 70) | function remove_drivers(staffOnly = false) {
  function insert_space (line 86) | function insert_space(str) {
  function format_name (line 90) | function format_name(fullName, nameSplitted, spanName, spanLastName, onl...
  function place_drivers (line 127) | function place_drivers(driversArray) {
  function add_edit_container (line 172) | function add_edit_container(div) {
  function update_name (line 196) | function update_name(driverID, name) {
  function sortList (line 215) | function sortList(divID) {
  function place_staff (line 240) | function place_staff(staffArray) {
  function initFreeDriversElems (line 304) | function initFreeDriversElems() {
  function manage_staff_drivers (line 325) | function manage_staff_drivers(value) {
  function add_future_team_noti (line 348) | function add_future_team_noti(driverDiv, teamInfo) {
  function add_junior_formula_logo (line 355) | function add_junior_formula_logo(driverDiv, juniorInfo) {
  function getDirectAffiliateDrivers (line 374) | function getDirectAffiliateDrivers(affiliatesDiv) {
  function getAffiliateScrollStep (line 378) | function getAffiliateScrollStep(affiliatesDiv) {
  function clamp (line 393) | function clamp(number, min, max) {
  function updateAffiliateArrows (line 397) | function updateAffiliateArrows(wrapper) {
  function setupAffiliateScroller (line 437) | function setupAffiliateScroller(wrapper) {
  function updateColor (line 487) | function updateColor(div) {
  function manageColor (line 505) | function manageColor(div, lastName) {
  function addIcon (line 518) | function addIcon(div) {
  function iconListener (line 533) | function iconListener(icon) {
  function manage_modal_driver_staff (line 569) | function manage_modal_driver_staff(type) {
  function manage_modal (line 682) | function manage_modal(info) {
  function getJuniorMaxCars (line 815) | function getJuniorMaxCars(teamId) {
  function setJuniorPosInputLimits (line 823) | function setJuniorPosInputLimits(teamId) {
  function renderJuniorDriversList (line 835) | function renderJuniorDriversList() {
  function ensureJuniorTeamDropdownBuilt (line 884) | function ensureJuniorTeamDropdownBuilt() {
  function loadJuniorTeamDrivers (line 977) | function loadJuniorTeamDrivers(payload) {
  function formatNumber (line 1034) | function formatNumber(num) {
  function formatPosInTeamFutureLabel (line 1038) | function formatPosInTeamFutureLabel(pos) {
  function parsePosInTeamFutureValue (line 1045) | function parsePosInTeamFutureValue(raw) {
  function getPosInTeamFutureValue (line 1055) | function getPosInTeamFutureValue(input) {
  function setPosInTeamFutureValue (line 1063) | function setPosInTeamFutureValue(input, pos, opts = {}) {
  function attachHoldPosInTeamFuture (line 1081) | function attachHoldPosInTeamFuture(btn, input, delta) {
  function setupPosInTeamFutureControls (line 1116) | function setupPosInTeamFutureControls(input, plusBtn, minusBtn) {
  function attachHoldWithAttrClamp (line 1173) | function attachHoldWithAttrClamp(btn, input, step, opts = {}) {
  function setupContractModalButtons (line 1202) | function setupContractModalButtons() {
  function fetchContracts (line 1243) | function fetchContracts(elem) {
  function manageDrivers (line 1257) | function manageDrivers(...divs) {
  function clearModal (line 1309) | function clearModal() {
  function editContract (line 1321) | function editContract() {
  function manage_swap (line 1387) | function manage_swap() {
  function signDriver (line 1401) | function signDriver(type) {
  function setLineupsButtonState (line 1629) | function setLineupsButtonState(isOpen) {
  function getLineupsDisplaySeason (line 1644) | function getLineupsDisplaySeason() {
  function setLineupsSeasonPillActive (line 1650) | function setLineupsSeasonPillActive(seasonType) {
  function getLineupsTeamIds (line 1660) | function getLineupsTeamIds(payload) {
  function buildFallbackLogo (line 1680) | function buildFallbackLogo(teamId) {
  function getTeamTemplateById (line 1687) | function getTeamTemplateById(teamId) {
  function createTeamLogoNode (line 1692) | function createTeamLogoNode(teamId) {
  function getTeamNameForLineup (line 1708) | function getTeamNameForLineup(teamId, teamInfo) {
  function normalizeDriverNumber (line 1716) | function normalizeDriverNumber(value) {
  function getDriverSeatPriority (line 1721) | function getDriverSeatPriority(driver, seasonType) {
  function getLineupDriversBySeat (line 1731) | function getLineupDriversBySeat(teamInfo, seasonType) {
  function createLineupDriverRows (line 1763) | function createLineupDriverRows(teamInfo, seasonType) {
  function buildLineupCard (line 1815) | function buildLineupCard(teamId, teamInfo, seasonType) {
  function computeLineupPositions (line 1853) | function computeLineupPositions(teamIds, width, height) {
  function updateLineupPillLabels (line 1925) | function updateLineupPillLabels(season) {
  function renderLineupsCircle (line 1936) | function renderLineupsCircle() {
  function renderLineupsAfterLayout (line 1974) | function renderLineupsAfterLayout() {
  function refreshLineupsCircleAfterTeamReplace (line 1980) | function refreshLineupsCircleAfterTeamReplace() {
  function fetchLineupsData (line 1990) | async function fetchLineupsData() {
  function closeLineupsView (line 1997) | function closeLineupsView() {
  function openLineupsView (line 2005) | async function openLineupsView() {
  function hire_modal_standars (line 2050) | function hire_modal_standars() {
  method start (line 2067) | start(event) {
  method move (line 2089) | move(event) {
  method end (line 2101) | end(event) {
Condensed preview — 104 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (4,511K chars).
[
  {
    "path": ".github/FUNDING.yml",
    "chars": 693,
    "preview": "# These are supported funding model platforms\n\ngithub: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [u"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "chars": 660,
    "preview": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: \"[BUG]\"\nlabels: bug\nassignees: ''\n\n---\n\n**Describe"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "chars": 613,
    "preview": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: \"[FEATURE]\"\nlabels: enhancement\nassignees: ''\n\n"
  },
  {
    "path": ".github/workflows/nightly.yml",
    "chars": 406,
    "preview": "name: Nightly Vercel Deploy\non:\n  schedule:\n    - cron: '0 2 * * *'   # 02:00 UTC → 03:00/04:00 en Madrid según DST\n  wo"
  },
  {
    "path": ".gitignore",
    "chars": 296,
    "preview": "node_modules\nresult\nlicenses\nbackup\nlog.txt\n**/build/back\n**/__pycache__\n*.sav\nconfigs/*.json\nDBEditor\nassets/custom/*.p"
  },
  {
    "path": "LICENSE",
    "chars": 35149,
    "preview": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free "
  },
  {
    "path": "README.md",
    "chars": 5853,
    "preview": "<img width=\"1875\" height=\"625\" alt=\"Copia de DATABASE EDITOR F1 MANAGER 23\" src=\"https://github.com/user-attachments/ass"
  },
  {
    "path": "api/ask-openai.js",
    "chars": 2039,
    "preview": "import OpenAI from \"openai\";\nimport { getUserTierServer } from \"../lib/getUserTierServer.js\";\nimport { getDailyLimitForT"
  },
  {
    "path": "api/auth/patreon/login.js",
    "chars": 634,
    "preview": "export default function handler(req, res) {\n    const { PATREON_CLIENT_ID, PATREON_REDIRECT_URI } = process.env;\n\n    if"
  },
  {
    "path": "api/auth/patreon/logout.js",
    "chars": 409,
    "preview": "import { serialize } from 'cookie';\n\nexport default function handler(req, res) {\n    const cookie = serialize('auth_toke"
  },
  {
    "path": "api/auth/patreon/verify.js",
    "chars": 5209,
    "preview": "import jwt from 'jsonwebtoken';\nimport { serialize } from 'cookie';\nimport { getEffectiveTier } from '../../../lib/acces"
  },
  {
    "path": "api/check-cookie.js",
    "chars": 1263,
    "preview": "import jwt from \"jsonwebtoken\";\nimport { serialize } from \"cookie\";\n\nexport default function handler(req, res) {\n  const"
  },
  {
    "path": "api/me.js",
    "chars": 1377,
    "preview": "import jwt from 'jsonwebtoken';\nimport { getEffectiveTier } from '../lib/accessControl.js';\n\nexport default function han"
  },
  {
    "path": "api/usage-today.js",
    "chars": 989,
    "preview": "import { getUserTierServer } from \"../lib/getUserTierServer.js\";\nimport { getDailyLimitForTier } from \"../lib/rateLimits"
  },
  {
    "path": "assets/custom/.gitkeep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "lib/accessControl.js",
    "chars": 1307,
    "preview": "const TIER_ORDER = {\n  Free: 0,\n  Backer: 1,\n  Insider: 2,\n  Founder: 3,\n};\n\nfunction normalizeName(name) {\n  return Str"
  },
  {
    "path": "lib/getUserTierServer.js",
    "chars": 971,
    "preview": "import jwt from \"jsonwebtoken\";\nimport { getEffectiveTier } from \"./accessControl.js\";\n\nexport function getUserTierServe"
  },
  {
    "path": "lib/rateLimits.js",
    "chars": 317,
    "preview": "export function getDailyLimitForTier(tier) {\n  const limits = {\n    Founder: Number(process.env.DAILY_LIMIT_FOUNDER),\n  "
  },
  {
    "path": "lib/redis.js",
    "chars": 78,
    "preview": "import { Redis } from \"@upstash/redis\";\n\nexport const redis = Redis.fromEnv();"
  },
  {
    "path": "package.json",
    "chars": 1673,
    "preview": "{\n  \"name\": \"Database Editor F1 Manager\",\n  \"version\": \"3.5.13\",\n  \"description\": \"A tool that will let you edit your sa"
  },
  {
    "path": "src/data/2025_changes.json",
    "chars": 209411,
    "preview": "{\n    \"Stats\": [\n        {\n            \"Max\": 100,\n            \"StaffID\": 1,\n            \"StatID\": 2,\n            \"Val\":"
  },
  {
    "path": "src/data/2026_changes.json",
    "chars": 15870,
    "preview": "{\n    \"Calendar\": [\n        {\n            \"TrackID\": 1,\n            \"Day\": 46089,\n            \"WeekendType\": 0\n        }"
  },
  {
    "path": "src/data/contracts_2025.json",
    "chars": 35928,
    "preview": "{\n    \"Updates\": [\n        {\n            \"DriverID\": 10,\n            \"salary\": 52000000,\n            \"StartingBonus\": 20"
  },
  {
    "path": "src/data/members.json",
    "chars": 6261,
    "preview": "[\n{\"name\":\"Viggo\",\"tier\":\"backer\"},\n{\"name\":\"The Logical Bass Fish\",\"tier\":\"backer\"},\n{\"name\":\"Kymani Clark\",\"tier\":\"bac"
  },
  {
    "path": "src/data/news/news_prompts_templates.json",
    "chars": 16978,
    "preview": "[\n    {\n        \"id\": \"quali_result\",\n        \"new_type\": 1,\n        \"prompt\": \"Write ONLY the body (not the title) of a"
  },
  {
    "path": "src/data/news/news_titles_templates.json",
    "chars": 44208,
    "preview": "[\n    {\n        \"id\": \"quali_result\",\n        \"new_type\": 1,\n        \"titles\": [\n            \"{{pole_driver}} takes pole"
  },
  {
    "path": "src/data/news/turning_points_prompts_templates.json",
    "chars": 19227,
    "preview": "[\n    {\n        \"id\": \"technical_directive\",\n        \"new_type\": 100,\n        \"prompt\": \"Write ONLY the body (not the ti"
  },
  {
    "path": "src/data/news/turning_points_titles_templates.json",
    "chars": 32150,
    "preview": "[\n    {\n        \"id\":  \"fia_directive\",\n        \"new_type\":  100,\n        \"turning_titles\":  [\n                         "
  },
  {
    "path": "src/data/nightly_patch_notes.md",
    "chars": 2506,
    "preview": "## 18th january\n- Added Show/Hide details in standings view to show positions gaines/lodst and gap to leader\n- Added man"
  },
  {
    "path": "src/data/records.json",
    "chars": 28863,
    "preview": "[\n  {\n    \"id\": -1,\n    \"name\": \"Michael Schumacher\",\n    \"firstRace\": { \"season\": 1991, \"trackName\": \"Belgium\" },\n    \""
  },
  {
    "path": "src/data/tables_2026.json",
    "chars": 1136400,
    "preview": "{\n  \"Staff_BasicData\": [\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 31054,\n      \"DOB_ISO\": \"1985"
  },
  {
    "path": "src/index.html",
    "chars": 359162,
    "preview": "<!DOCTYPE html>\n<html>\n\n<head>\n  <meta charset=\"UTF-8\">\n  <!-- https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP -->"
  },
  {
    "path": "src/index.js",
    "chars": 811,
    "preview": "// Bootstrap\nimport \"bootstrap/dist/css/bootstrap.min.css\";\nimport 'bootstrap-icons/font/bootstrap-icons.min.css';\n\n// R"
  },
  {
    "path": "src/js/backend/UESaveHandler.js",
    "chars": 4966,
    "preview": "import { Gvas, Serializer } from \"./UESaveTool\";\nimport pako from \"pako\";\nimport { saveAs } from \"file-saver\";\nimport { "
  },
  {
    "path": "src/js/backend/UESaveTool/Gvas.js",
    "chars": 1386,
    "preview": "import {PropertyFactory} from './factories';\nimport {GvasHeader} from \"./GvasHeader\";\nimport {Tuple} from './properties'"
  },
  {
    "path": "src/js/backend/UESaveTool/GvasHeader.js",
    "chars": 4012,
    "preview": "import {SerializationError} from '.';\nimport {PropertyFactory} from './factories';\nimport {Serializer} from './Serialize"
  },
  {
    "path": "src/js/backend/UESaveTool/LICENSE",
    "chars": 1064,
    "preview": "MIT License\n\nCopyright © 2021 by Ch1pset\n\nPermission is hereby granted, free of charge, to any person obtaining a copy o"
  },
  {
    "path": "src/js/backend/UESaveTool/PropertyErrors.js",
    "chars": 518,
    "preview": "export class SerializationError extends Error {\n    constructor(prop) {\n        super(`Problem occurred during serializa"
  },
  {
    "path": "src/js/backend/UESaveTool/Serializer.js",
    "chars": 3936,
    "preview": "\nimport { Buffer } from \"buffer\";\nexport class Serializer {\n    constructor(buf) {\n        this._data = buf;\n        thi"
  },
  {
    "path": "src/js/backend/UESaveTool/arrays/IntArray.js",
    "chars": 1498,
    "preview": "import { Property } from '../properties/'\nimport { PropertyFactory } from '../factories'\nimport { SerializationError } f"
  },
  {
    "path": "src/js/backend/UESaveTool/arrays/SoftObjectArray.js",
    "chars": 1224,
    "preview": "import { Property } from '../properties/'\nimport { SerializationError } from '..';\nimport { Serializer } from '../Serial"
  },
  {
    "path": "src/js/backend/UESaveTool/arrays/StructArray.js",
    "chars": 1272,
    "preview": "import { StructProperty } from \"../properties/index.js\";\nimport { PropertyFactory } from \"../index.js\";\n\nexport class St"
  },
  {
    "path": "src/js/backend/UESaveTool/arrays/index.js",
    "chars": 142,
    "preview": "\nexport { IntArray } from './IntArray'\nexport { SoftObjectArray } from './SoftObjectArray'\nexport { StructArray } from '"
  },
  {
    "path": "src/js/backend/UESaveTool/factories.js",
    "chars": 545,
    "preview": "import { TypeNotImplementedError } from './index';\n\nclass Factory {\n  constructor() {\n    this.Properties = {}\n    this."
  },
  {
    "path": "src/js/backend/UESaveTool/index.js",
    "chars": 1911,
    "preview": "import {IntArray, SoftObjectArray, StructArray} from './arrays'\nimport {PropertyFactory} from './factories';\nimport {\n  "
  },
  {
    "path": "src/js/backend/UESaveTool/properties/ArrayProperty.js",
    "chars": 2385,
    "preview": "import { Buffer } from 'buffer'\nimport { Property } from './'\nimport { PropertyFactory } from '../factories';\nimport { S"
  },
  {
    "path": "src/js/backend/UESaveTool/properties/BoolProperty.js",
    "chars": 1047,
    "preview": "import { Property } from './'\nimport { Serializer } from '..';\nimport { SerializationError } from '../PropertyErrors';\n\n"
  },
  {
    "path": "src/js/backend/UESaveTool/properties/EnumProperty.js",
    "chars": 1254,
    "preview": "import { Serializer } from '../Serializer';\nimport { SerializationError } from '../PropertyErrors';\nimport { Property } "
  },
  {
    "path": "src/js/backend/UESaveTool/properties/FloatProperty.js",
    "chars": 1126,
    "preview": "import { Serializer } from '../Serializer';\nimport { SerializationError } from '../PropertyErrors';\nimport { Property } "
  },
  {
    "path": "src/js/backend/UESaveTool/properties/Guid.js",
    "chars": 1456,
    "preview": "import { Buffer } from 'buffer'\nimport { Property } from './'\nimport { SerializationError } from '..';\nimport { Serializ"
  },
  {
    "path": "src/js/backend/UESaveTool/properties/Int16Property.js",
    "chars": 1327,
    "preview": "import { Property } from './'\nimport { Serializer } from '..';\nimport { SerializationError } from '../PropertyErrors';\n\n"
  },
  {
    "path": "src/js/backend/UESaveTool/properties/Int64Property.js",
    "chars": 1698,
    "preview": "import { Property } from './'\nimport { Serializer } from '..';\nimport { SerializationError } from '../PropertyErrors';\n\n"
  },
  {
    "path": "src/js/backend/UESaveTool/properties/Int8Property.js",
    "chars": 1309,
    "preview": "import { Property } from './'\nimport { Serializer } from '..';\nimport { SerializationError } from '../PropertyErrors';\n\n"
  },
  {
    "path": "src/js/backend/UESaveTool/properties/IntProperty.js",
    "chars": 2519,
    "preview": "import { Property } from './'\nimport { Serializer } from '..';\nimport { SerializationError } from '../PropertyErrors';\n\n"
  },
  {
    "path": "src/js/backend/UESaveTool/properties/ObjectProperty.js",
    "chars": 1051,
    "preview": "import { Serializer } from '../Serializer';\nimport { SerializationError } from '../PropertyErrors';\nimport { Property } "
  },
  {
    "path": "src/js/backend/UESaveTool/properties/Property.js",
    "chars": 1375,
    "preview": "import { Serializer } from '../'\nexport class Property {\n    constructor() {\n        this.Name = \"\";\n        this.Type ="
  },
  {
    "path": "src/js/backend/UESaveTool/properties/SoftObjectProperty.js",
    "chars": 1104,
    "preview": "import { SerializationError } from '../PropertyErrors';\nimport { Property } from './'\nimport { Serializer } from '../Ser"
  },
  {
    "path": "src/js/backend/UESaveTool/properties/StrProperty.js",
    "chars": 1688,
    "preview": "import {SerializationError} from \"../PropertyErrors\";\nimport {Serializer} from '../Serializer';\nimport {Property} from '"
  },
  {
    "path": "src/js/backend/UESaveTool/properties/StrProperty_.js",
    "chars": 2261,
    "preview": "import {SerializationError} from \"../PropertyErrors\";\nimport {Serializer} from '../Serializer';\nimport {Property} from '"
  },
  {
    "path": "src/js/backend/UESaveTool/properties/StructProperty.js",
    "chars": 2563,
    "preview": "import { Property } from './'\nimport { PropertyFactory } from '../factories';\nimport { Serializer } from '../Serializer'"
  },
  {
    "path": "src/js/backend/UESaveTool/properties/Tuple.js",
    "chars": 1546,
    "preview": "import { Property } from './'\nimport { PropertyFactory } from '../factories';\nimport { SerializationError } from '..';\ni"
  },
  {
    "path": "src/js/backend/UESaveTool/properties/index.js",
    "chars": 723,
    "preview": "export { Property } from './Property'\nexport { BoolProperty } from './BoolProperty'\nexport { IntProperty } from './IntPr"
  },
  {
    "path": "src/js/backend/command.js",
    "chars": 2848,
    "preview": "// Command.js\nimport { updateFront } from \"../frontend/renderer\";\nimport { dbWorker } from \"../frontend/dragFile\";\nimpor"
  },
  {
    "path": "src/js/backend/commandGlobals.js",
    "chars": 1314,
    "preview": "// commandGlobals.js\nexport const teamReplaceDict = {\n    \"Alpha Tauri\": \"Alpha Tauri\", \"Alpine\": \"Alpine\", \"Alfa Romeo\""
  },
  {
    "path": "src/js/backend/dbManager.js",
    "chars": 2067,
    "preview": "let db = null;\nlet metadata = null;\n\nexport function setDatabase(database, meta) {\n  db = database;\n\n  metadata = meta;\n"
  },
  {
    "path": "src/js/backend/scriptUtils/calendarUtils.js",
    "chars": 7077,
    "preview": "import { queryDB } from \"../dbManager\";\n\nconst weatherDict = {\n  \"0\": 1,\n  \"1\": 2,\n  \"2\": 4,\n  \"3\": 8,\n  \"4\": 16,\n  \"5\":"
  },
  {
    "path": "src/js/backend/scriptUtils/carAnalysisUtils.js",
    "chars": 56304,
    "preview": "import * as carConstants from './carConstants.js';\nimport { queryDB } from '../dbManager.js';\nimport { manage_engine_cha"
  },
  {
    "path": "src/js/backend/scriptUtils/carConstants.js",
    "chars": 6945,
    "preview": "export const stats = {\n    0: \"airflow_front\",\n    1: \"airflow_sensitivity\",\n    2: \"brake_cooling\",\n    3: \"drs_delta\","
  },
  {
    "path": "src/js/backend/scriptUtils/countries.js",
    "chars": 6445,
    "preview": "export const countries_abreviations = {\n    \"Andorra\": \"AD\",\n    \"United Arab Emirates\": \"AE\",\n    \"Afghanistan\": \"AF\",\n"
  },
  {
    "path": "src/js/backend/scriptUtils/createStaffUtils.js",
    "chars": 8655,
    "preview": "import { queryDB } from \"../dbManager\";\nimport { countries_abreviations, inverted_countries_abreviations } from \"./count"
  },
  {
    "path": "src/js/backend/scriptUtils/dbUtils.js",
    "chars": 118362,
    "preview": "import { countries_abreviations } from \"./countries.js\";\nimport { engine_unitValueToValue } from \"./carConstants.js\";\nim"
  },
  {
    "path": "src/js/backend/scriptUtils/editTeamUtils.js",
    "chars": 8732,
    "preview": "import { queryDB } from \"../dbManager\";\n\nexport function fetchTeamData(teamID){\n    const levCon = queryDB(`\n        SEL"
  },
  {
    "path": "src/js/backend/scriptUtils/eidtStatsUtils.js",
    "chars": 10015,
    "preview": "import { queryDB } from \"../dbManager\";\n\n// Constantes para referencias en la edición de mentalidad\nexport const driverS"
  },
  {
    "path": "src/js/backend/scriptUtils/head2head.js",
    "chars": 26619,
    "preview": "import { queryDB } from \"../dbManager\";\n\n// Helpers para estadísticos:\nconst mean = (arr) => {\n  if (!arr.length) return"
  },
  {
    "path": "src/js/backend/scriptUtils/modUtils.js",
    "chars": 69656,
    "preview": "import { getGlobals } from \"../commandGlobals.js\";\nimport { queryDB, setMetaData, getMetadata } from \"../dbManager.js\";\n"
  },
  {
    "path": "src/js/backend/scriptUtils/newsUtils.js",
    "chars": 274137,
    "preview": "import { fetchEventsDoneFrom, formatNamesSimple, fetchEventsDoneBefore, fetchPointsRegulations, computeDriverOfTheDayFro"
  },
  {
    "path": "src/js/backend/scriptUtils/recordUtils.js",
    "chars": 47059,
    "preview": "import { queryDB, setMetaData, getMetadata } from \"../dbManager.js\";\nimport { formatNamesSimple, fetchDriverOfTheDayCoun"
  },
  {
    "path": "src/js/backend/scriptUtils/regulationsUtils.js",
    "chars": 4423,
    "preview": "import { queryDB } from \"../dbManager.js\";\n\nexport function fetchRegulationsData() {\n  const enumRows = queryDB(\n    `SE"
  },
  {
    "path": "src/js/backend/scriptUtils/transferUtils.js",
    "chars": 36920,
    "preview": "import { getGlobals } from \"../commandGlobals\";\nimport { queryDB } from \"../dbManager\";\n\nexport const minMaxTypeStaff = "
  },
  {
    "path": "src/js/backend/scriptUtils/triggerUtils.js",
    "chars": 16740,
    "preview": "import { queryDB } from \"../dbManager\";\n\nconst difficultyDict = {\n  0: {\n    name: \"default\",\n    perc: 0,\n    \"7and8\": "
  },
  {
    "path": "src/js/backend/worker.js",
    "chars": 41145,
    "preview": "import {\n  fetchSeasonResults, fetchEventsFrom, fetchTeamsStandings,\n  fetchTeamsStandingsWithPositionChange,\n  fetchDri"
  },
  {
    "path": "src/js/frontend/calendar.js",
    "chars": 17215,
    "preview": "import { races_map, codes_dict, weather_dict, countries_dict, invertedRacesMap } from \"./config\";\nimport { game_version "
  },
  {
    "path": "src/js/frontend/config.js",
    "chars": 35504,
    "preview": "// calendar\nexport let codes_dict = {\n    \"bah0\": \"../assets/images/bahrain.png\", \"sau0\": \"../assets/images/saudi.jpg\", "
  },
  {
    "path": "src/js/frontend/devTools.js",
    "chars": 5877,
    "preview": "import { saveAs } from \"file-saver\";\nimport { Command } from \"../backend/command.js\";\n\nconst isLocalhost =\n  window.loca"
  },
  {
    "path": "src/js/frontend/dragFile.js",
    "chars": 6741,
    "preview": "// dragDrop.js\nimport { gamePill, editorPill, setSaveName, new_update_notifications, setIsShowingNotification } from \"./"
  },
  {
    "path": "src/js/frontend/head2head.js",
    "chars": 81987,
    "preview": "import { races_names, team_dict, combined_dict, lightColors, theme_colors, logos_disc } from \"./config\";\nimport { game_v"
  },
  {
    "path": "src/js/frontend/news.js",
    "chars": 209696,
    "preview": "import { team_dict, combined_dict, races_names, names_full, countries_data, logos_disc, lightColors, part_full_names, CU"
  },
  {
    "path": "src/js/frontend/performance.js",
    "chars": 64998,
    "preview": "import { races_names, part_codes_abreviations, codes_dict, combined_dict, races_map, abreviations_dict, pars_abreviation"
  },
  {
    "path": "src/js/frontend/recentsManager.js",
    "chars": 1251,
    "preview": "import { get, set } from 'idb-keyval';\n\nconst DB_NAME = \"SaveEditorDB\";\nconst STORE_NAME = \"recentFileHandles\";\nconst DB"
  },
  {
    "path": "src/js/frontend/regulations.js",
    "chars": 12841,
    "preview": "import { attachHold } from \"./renderer\";\n\nlet regulationsState = null;\n\nconst root = document.getElementById(\"regulation"
  },
  {
    "path": "src/js/frontend/renderer.js",
    "chars": 111809,
    "preview": "import { marked } from 'marked';\nimport DOMPurify from 'dompurify';\n\nimport { resetTeamEditing, fillLevels, longTermObj,"
  },
  {
    "path": "src/js/frontend/seasonMods.js",
    "chars": 24548,
    "preview": "import { set } from \"idb-keyval\";\nimport { Command } from \"../backend/command.js\";\nimport { applyConfigFromEditorUI, cus"
  },
  {
    "path": "src/js/frontend/seasonViewer.js",
    "chars": 205308,
    "preview": "import { races_names, names_full, team_dict, codes_dict, countries_data, combined_dict, logos_disc, races_map, driversTa"
  },
  {
    "path": "src/js/frontend/stats.js",
    "chars": 79267,
    "preview": "import { inverted_countries_abreviations } from \"../backend/scriptUtils/countries\";\nimport { team_dict, mentalityModifie"
  },
  {
    "path": "src/js/frontend/teamReplacements.js",
    "chars": 25647,
    "preview": "import { Command } from \"../backend/command.js\";\n\nexport const names_configs = {\n    \"visarb\": \"VISA CASHAPP RB\", \"toyot"
  },
  {
    "path": "src/js/frontend/teams.js",
    "chars": 12990,
    "preview": "import { team_dict } from \"./config\";\nimport { Command } from \"../backend/command.js\";\nimport { manage_stat_bar } from \""
  },
  {
    "path": "src/js/frontend/transfers.js",
    "chars": 95113,
    "preview": "import { staff_pics, team_dict, combined_dict, staff_positions, typeStaff_dict, f1_teams, f2_teams, f3_teams, inverted_d"
  },
  {
    "path": "src/styles.css",
    "chars": 391205,
    "preview": "@font-face {\n  font-family: 'Formula1';\n  src: url(\"../assets/fonts/Formula1-Regular.ttf\") format('truetype');\n}\n\n@font-"
  },
  {
    "path": "src/themes.css",
    "chars": 58895,
    "preview": ":root {\n    /*\n  GENERAL COLORS\n  */\n\n    --hero-title: #eeeeee;\n    --background: #111111;\n    --generals: #1e1e1e;\n   "
  },
  {
    "path": "vercel.json",
    "chars": 239,
    "preview": "{\n    \"headers\": [\n      {\n        \"source\": \"/assets/images/(.*)\", \n        \"headers\": [\n          {\n            \"key\":"
  },
  {
    "path": "webpack.config.js",
    "chars": 2339,
    "preview": "const path = require('path');\nconst HtmlWebpackPlugin = require('html-webpack-plugin');\nconst MiniCssExtractPlugin = req"
  }
]

// ... and 3 more files (download for full content)

About this extraction

This page contains the full source code of the IUrreta/DatabaseEditor GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 104 files (4.0 MB), approximately 1.1M tokens, and a symbol index with 1194 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!